diff --git a/src/main/java/com/avaje/ebean/config/PropertyMap.java b/src/main/java/com/avaje/ebean/config/PropertyMap.java index 9667304e8..9985ed441 100644 --- a/src/main/java/com/avaje/ebean/config/PropertyMap.java +++ b/src/main/java/com/avaje/ebean/config/PropertyMap.java @@ -18,6 +18,14 @@ public final class PropertyMap implements Serializable { private final LinkedHashMap map = new LinkedHashMap(); + /** + * Return properties loaded from test-ebean.properties. + */ + public static Properties testProperties() { + PropertyMap propertyMap = PropertyMapLoader.loadTestProperties(); + return (propertyMap == null) ? new Properties() : propertyMap.asProperties(); + } + public static Properties defaultProperties() { PropertyMap propertyMap = PropertyMapLoader.loadGlobalProperties(); return (propertyMap == null) ? new Properties() : propertyMap.asProperties(); diff --git a/src/main/java/com/avaje/ebean/config/PropertyMapLoader.java b/src/main/java/com/avaje/ebean/config/PropertyMapLoader.java index e72f067f3..6f5e3f201 100644 --- a/src/main/java/com/avaje/ebean/config/PropertyMapLoader.java +++ b/src/main/java/com/avaje/ebean/config/PropertyMapLoader.java @@ -14,17 +14,34 @@ final class PropertyMapLoader { private static final Logger logger = LoggerFactory.getLogger(PropertyMapLoader.class); + /** + * Load the test-ebean.properties. + */ + public static PropertyMap loadTestProperties() { + return load(null, "test-ebean.properties", false); + } + + /** + * Load the ebean.properties (and test-ebean.properties if present). + */ public static PropertyMap loadGlobalProperties() { + boolean loadTestProperties = false; String fileName = System.getenv("EBEAN_PROPS_FILE"); if (fileName == null) { fileName = System.getProperty("ebean.props.file"); if (fileName == null) { + loadTestProperties = true; fileName = "ebean.properties"; } } - return load(null, fileName); + PropertyMap map = load(null, fileName, true); + if (loadTestProperties) { + // load test properties if present in classpath + load(map, "test-ebean.properties", false); + } + return map; } /** @@ -35,11 +52,13 @@ final class PropertyMapLoader { * @param fileName * the name of the properties file to load. */ - public static PropertyMap load(PropertyMap p, String fileName) { + public static PropertyMap load(PropertyMap p, String fileName, boolean errorOnNull) { InputStream is = findInputStream(fileName); if (is == null) { - logger.error(fileName + " not found"); + if (errorOnNull) { + logger.error(fileName + " not found"); + } return p; } else { return load(p, is); diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index 7c33fe549..d644365ee 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -2040,6 +2040,21 @@ public class ServerConfig { loadSettings(p); } + /** + * Load settings from test-ebean.properties and do nothing if the properties is not found. + *

+ * This is typically used when test-ebean.properties is put into the test class path and used + * to configure Ebean for running tests. + *

+ */ + public void loadTestProperties() { + Properties properties = PropertyMap.testProperties(); + if (!properties.isEmpty()) { + PropertiesWrapper p = new PropertiesWrapper("ebean", name, properties); + loadSettings(p); + } + } + /** * Return the properties that we used for configuration and were set via a call to loadFromProperties(). */ @@ -2048,8 +2063,11 @@ public class ServerConfig { } @SuppressWarnings("unchecked") - private T createInstance(PropertiesWrapper p, Class pluginType, String key) { + private T createInstance(PropertiesWrapper p, Class pluginType, String key, T instance) { + if (instance != null) { + return instance; + } String classname = p.get(key, null); return classname == null ? null : (T) ClassUtil.newInstance(classname); } @@ -2097,15 +2115,15 @@ public class ServerConfig { autoCommitMode = p.getBoolean("autoCommitMode", autoCommitMode); useJtaTransactionManager = p.getBoolean("useJtaTransactionManager", useJtaTransactionManager); - currentUserProvider = createInstance(p, CurrentUserProvider.class, "currentUserProvider"); disableClasspathSearch = p.getBoolean("disableClasspathSearch", disableClasspathSearch); - databasePlatform = createInstance(p, DatabasePlatform.class, "databasePlatform"); - encryptKeyManager = createInstance(p, EncryptKeyManager.class, "encryptKeyManager"); - encryptDeployManager = createInstance(p, EncryptDeployManager.class, "encryptDeployManager"); - encryptor = createInstance(p, Encryptor.class, "encryptor"); - dbEncrypt = createInstance(p, DbEncrypt.class, "dbEncrypt"); - serverCacheFactory = createInstance(p, ServerCacheFactory.class, "serverCacheFactory"); - serverCacheManager = createInstance(p, ServerCacheManager.class, "serverCacheManager"); + currentUserProvider = createInstance(p, CurrentUserProvider.class, "currentUserProvider", currentUserProvider); + databasePlatform = createInstance(p, DatabasePlatform.class, "databasePlatform", databasePlatform); + encryptKeyManager = createInstance(p, EncryptKeyManager.class, "encryptKeyManager", encryptKeyManager); + encryptDeployManager = createInstance(p, EncryptDeployManager.class, "encryptDeployManager", encryptDeployManager); + encryptor = createInstance(p, Encryptor.class, "encryptor", encryptor); + dbEncrypt = createInstance(p, DbEncrypt.class, "dbEncrypt", dbEncrypt); + serverCacheFactory = createInstance(p, ServerCacheFactory.class, "serverCacheFactory", serverCacheFactory); + serverCacheManager = createInstance(p, ServerCacheManager.class, "serverCacheManager", serverCacheManager); cacheWarmingDelay = p.getInt("cacheWarmingDelay", cacheWarmingDelay); classPathReaderClassName = p.get("classpathreader"); @@ -2176,7 +2194,7 @@ public class ServerConfig { private NamingConvention createNamingConvention(PropertiesWrapper properties, NamingConvention namingConvention) { - NamingConvention nc = createInstance(properties, NamingConvention.class, "namingconvention"); + NamingConvention nc = createInstance(properties, NamingConvention.class, "namingconvention", null); return (nc != null) ? nc : namingConvention; } diff --git a/src/test/java/com/avaje/ebean/config/ServerConfigTest.java b/src/test/java/com/avaje/ebean/config/ServerConfigTest.java index 603ab289b..6701aa3dd 100644 --- a/src/test/java/com/avaje/ebean/config/ServerConfigTest.java +++ b/src/test/java/com/avaje/ebean/config/ServerConfigTest.java @@ -47,6 +47,7 @@ public class ServerConfigTest { props1.setProperty("ebean.persistBatchOnCascade", "ALL"); serverConfig.loadFromProperties(props1); + serverConfig.loadTestProperties(); assertEquals(PersistBatch.ALL, serverConfig.getPersistBatch()); assertEquals(PersistBatch.ALL, serverConfig.getPersistBatchOnCascade()); diff --git a/src/test/resources/test-ebean.properties b/src/test/resources/test-ebean.properties new file mode 100644 index 000000000..2329a96dc --- /dev/null +++ b/src/test/resources/test-ebean.properties @@ -0,0 +1 @@ +datasource.h2.username=sa \ No newline at end of file