Author: aadamchik
Date: Sun Nov 17 16:34:28 2013
New Revision: 1542759
URL: http://svn.apache.org/r1542759
Log:
cleaning up unit test DataSource bootstrap
Specifically in a CI environment, in-memory DBs can be bootstrapped without
connection.properties
Modified:
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java
cayenne/main/trunk/pom.xml
Modified:
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java?rev=1542759&r1=1542758&r2=1542759&view=diff
==============================================================================
---
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java
(original)
+++
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java
Sun Nov 17 16:34:28 2013
@@ -19,12 +19,7 @@
package org.apache.cayenne.unit.di.server;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -32,8 +27,6 @@ import java.util.Map;
import org.apache.cayenne.conn.DataSourceInfo;
import org.apache.commons.collections.ExtendedProperties;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
/**
* ConnectionProperties handles a set of DataSourceInfo objects using
@@ -41,231 +34,43 @@ import org.apache.commons.logging.LogFac
* purely a utility class. Its features are not used in deployment.
*/
class ConnectionProperties {
-
- private static final Log logger =
LogFactory.getLog(ConnectionProperties.class);
- public static final String EMBEDDED_DATASOURCE =
"internal_embedded_datasource";
- public static final String EMBEDDED_DATASOURCE_DBADAPTER =
"org.apache.cayenne.dba.hsqldb.HSQLDBAdapter";
- public static final String EMBEDDED_DATASOURCE_USERNAME = "sa";
- public static final String EMBEDDED_DATASOURCE_PASSWORD = "";
- public static final String EMBEDDED_DATASOURCE_URL =
"jdbc:hsqldb:mem:aname";
- public static final String EMBEDDED_DATASOURCE_JDBC_DRIVER =
"org.hsqldb.jdbcDriver";
-
- public static final String PROPERTIES_FILE = "connection.properties";
- public static final String ADAPTER_KEY = "adapter";
- static final String ADAPTER20_KEY = "cayenne.adapter";
- public static final String USER_NAME_KEY = "jdbc.username";
- public static final String PASSWORD_KEY = "jdbc.password";
- public static final String URL_KEY = "jdbc.url";
- public static final String DRIVER_KEY = "jdbc.driver";
-
- public static final String ADAPTER_KEY_MAVEN = "cayenneAdapter";
- public static final String USER_NAME_KEY_MAVEN = "cayenneJdbcUsername";
- public static final String PASSWORD_KEY_MAVEN = "cayenneJdbcPassword";
- public static final String URL_KEY_MAVEN = "cayenneJdbcUrl";
- public static final String DRIVER_KEY_MAVEN = "cayenneJdbcDriver";
-
- private static ConnectionProperties sharedInstance;
- private static Map<String, DataSourceInfo> connectionInfos = Collections
- .synchronizedMap(new HashMap<String, DataSourceInfo>());
+ private static final String ADAPTER_KEY = "adapter";
+ private static final String ADAPTER20_KEY = "cayenne.adapter";
+ private static final String USER_NAME_KEY = "jdbc.username";
+ private static final String PASSWORD_KEY = "jdbc.password";
+ private static final String URL_KEY = "jdbc.url";
+ private static final String DRIVER_KEY = "jdbc.driver";
- static {
- sharedInstance = loadDefaultProperties();
- }
-
- /**
- * Returns ConnectionProperties singleton.
- */
- public static ConnectionProperties getInstance() {
- return sharedInstance;
- }
-
- // CayenneUserDir is defined in the Modeler, not accessible here, so
- // hardcoding it for
- // the tests
- private static File cayenneUserDir() {
- File homeDir = new File(System.getProperty("user.home"));
- File cayenneDir = new File(homeDir, ".cayenne");
- cayenneDir.mkdirs();
- return cayenneDir;
- }
-
- /**
- * Loads connection properties from $HOME/.cayenne/connection.properties.
- */
- protected static ConnectionProperties loadDefaultProperties() {
-
- DataSourceInfo dsi = new DataSourceInfo();
-
- String adapter = System.getProperty(ADAPTER_KEY_MAVEN);
- String usr = System.getProperty(USER_NAME_KEY_MAVEN);
- String pass = System.getProperty(PASSWORD_KEY_MAVEN);
- String url = System.getProperty(URL_KEY_MAVEN);
- String driver = System.getProperty(DRIVER_KEY_MAVEN);
-
- String connectionKey =
System.getProperty(ServerCaseDataSourceInfoProvider.CONNECTION_NAME_KEY);
- File f = new File(cayenneUserDir(), PROPERTIES_FILE);
-
- try {
- if (f.exists()) {
-
- logger.info("Found connection properties at " +
f.getAbsolutePath());
-
- ConnectionProperties cp = new ConnectionProperties(new
ExtendedProperties(f.getAbsolutePath()));
-
- if (((adapter != null && !adapter.startsWith("$")) || (usr !=
null && !usr.startsWith("$"))
- || (pass != null && !pass.startsWith("$")) || (url !=
null && !url.startsWith("$")) || (driver != null && !driver
- .startsWith("$"))) && (connectionKey != null &&
!connectionKey.equals("null"))) {
-
- DataSourceInfo dsiOld = null;
- if (connectionInfos.get(connectionKey) != null) {
- dsiOld = connectionInfos.get(connectionKey);
- connectionInfos.remove(connectionKey);
- }
-
- if (adapter != null && !adapter.startsWith("$")) {
- dsi.setAdapterClassName(adapter);
- } else if (dsiOld != null) {
- dsi.setAdapterClassName(dsiOld.getAdapterClassName());
- }
- if (usr != null && !usr.startsWith("$")) {
- dsi.setUserName(usr);
- } else if (dsiOld != null) {
- dsi.setUserName(dsiOld.getUserName());
- }
- if (pass != null && !pass.startsWith("$")) {
- dsi.setPassword(pass);
- } else if (dsiOld != null) {
- dsi.setPassword(dsiOld.getPassword());
- }
- if (url != null && !url.startsWith("$")) {
- dsi.setDataSourceUrl(url);
- } else if (dsiOld != null) {
- dsi.setDataSourceUrl(dsiOld.getDataSourceUrl());
- }
- if (driver != null && !driver.startsWith("$")) {
- dsi.setJdbcDriver(driver);
- } else if (dsiOld != null) {
- dsi.setJdbcDriver(dsiOld.getJdbcDriver());
- }
- connectionInfos.put(connectionKey, dsi);
- } else {
- return cp;
- }
- } else {
- if (((adapter != null && !adapter.startsWith("$")) || (usr !=
null && !usr.startsWith("$"))
- || (pass != null && !pass.startsWith("$")) || (url !=
null && !url.startsWith("$")) || (driver != null && !driver
- .startsWith("$"))) && (connectionKey != null &&
!connectionKey.equals("null"))) {
-
- if (adapter != null && !adapter.startsWith("$")) {
- dsi.setAdapterClassName(adapter);
- }
- if (usr != null && !usr.startsWith("$")) {
- dsi.setUserName(usr);
- }
- if (pass != null && !pass.startsWith("$")) {
- dsi.setPassword(pass);
- }
- if (url != null && !url.startsWith("$")) {
- dsi.setDataSourceUrl(url);
- }
- if (driver != null && !driver.startsWith("$")) {
- dsi.setJdbcDriver(driver);
- }
- connectionInfos.put(connectionKey, dsi);
- }
-
- // lets touch this file so that users would get a clue of what
- // it is
- createSamplePropertiesFile(f);
-
- }
- } catch (IOException e) {
- // ignoring
- }
-
- return new ConnectionProperties(new ExtendedProperties());
- }
-
- protected static void createSamplePropertiesFile(File f) throws
IOException {
- BufferedWriter out = new BufferedWriter(new FileWriter(f));
-
- try {
- out.write("# Cayenne named connections configuration file.");
- out.newLine();
-
- out.write("#");
- out.newLine();
- out.write("# Sample named connections (named 'example1' and
'example2'): ");
- out.newLine();
-
- out.write("#");
- out.newLine();
- out.write("# example1." + ADAPTER_KEY + " =
org.apache.cayenne.dba.mysql.MySQLAdapter");
- out.newLine();
- out.write("# example1." + USER_NAME_KEY + " = some_user");
- out.newLine();
- out.write("# example1." + PASSWORD_KEY + " = some_passwd");
- out.newLine();
- out.write("# example1." + URL_KEY + " =
jdbc:mysql://localhost/cayenne");
- out.newLine();
- out.write("# example1." + DRIVER_KEY + " = com.mysql.jdbc.Driver");
- out.newLine();
-
- // example 2
- out.write("#");
- out.newLine();
- out.write("# example2." + ADAPTER_KEY + " =
org.apache.cayenne.dba.mysql.MySQLAdapter");
- out.newLine();
- out.write("# example2." + USER_NAME_KEY + " = some_user");
- out.newLine();
- out.write("# example2." + PASSWORD_KEY + " = some_passwd");
- out.newLine();
- out.write("# example2." + URL_KEY + " =
jdbc:mysql://localhost/cayenne");
- out.newLine();
- out.write("# example2." + DRIVER_KEY + " = com.mysql.jdbc.Driver");
- out.newLine();
- } finally {
- out.close();
- }
- }
+ private Map<String, DataSourceInfo> connectionInfos;
/**
* Constructor for ConnectionProperties.
*/
- public ConnectionProperties(ExtendedProperties props) {
- for (final String name : extractNames(props)) {
+ ConnectionProperties(ExtendedProperties props) {
+ connectionInfos = new HashMap<String, DataSourceInfo>();
+ for (String name : extractNames(props)) {
DataSourceInfo dsi = buildDataSourceInfo(props.subset(name));
connectionInfos.put(name, dsi);
}
}
+ int size() {
+ return connectionInfos.size();
+ }
+
/**
* Returns DataSourceInfo object for a symbolic name. If name does not
match
* an existing object, returns null.
*/
- public DataSourceInfo getConnectionInfo(String name) {
-
- if (EMBEDDED_DATASOURCE.equals(name)) {
- // Create embedded data source instead
- DataSourceInfo connectionInfo = new DataSourceInfo();
- connectionInfo.setAdapterClassName(EMBEDDED_DATASOURCE_DBADAPTER);
- connectionInfo.setUserName(EMBEDDED_DATASOURCE_USERNAME);
- connectionInfo.setPassword(EMBEDDED_DATASOURCE_PASSWORD);
- connectionInfo.setDataSourceUrl(EMBEDDED_DATASOURCE_URL);
- connectionInfo.setJdbcDriver(EMBEDDED_DATASOURCE_JDBC_DRIVER);
- return connectionInfo;
- }
-
- synchronized (connectionInfos) {
- return connectionInfos.get(name);
- }
+ DataSourceInfo getConnection(String name) {
+ return connectionInfos.get(name);
}
/**
* Creates a DataSourceInfo object from a set of properties.
*/
- public DataSourceInfo buildDataSourceInfo(ExtendedProperties props) {
+ private DataSourceInfo buildDataSourceInfo(ExtendedProperties props) {
DataSourceInfo dsi = new DataSourceInfo();
String adapter = props.getString(ADAPTER_KEY);
@@ -287,7 +92,7 @@ class ConnectionProperties {
/**
* Returns a list of connection names configured in the properties object.
*/
- public List<String> extractNames(ExtendedProperties props) {
+ private List<String> extractNames(ExtendedProperties props) {
Iterator<?> it = props.getKeys();
List<String> list = new ArrayList<String>();
Modified:
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java?rev=1542759&r1=1542758&r2=1542759&view=diff
==============================================================================
---
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java
(original)
+++
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java
Sun Nov 17 16:34:28 2013
@@ -18,39 +18,152 @@
****************************************************************/
package org.apache.cayenne.unit.di.server;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.cayenne.ConfigurationException;
import org.apache.cayenne.conn.DataSourceInfo;
+import org.apache.cayenne.dba.derby.DerbyAdapter;
+import org.apache.cayenne.dba.h2.H2Adapter;
+import org.apache.cayenne.dba.hsqldb.HSQLDBAdapter;
import org.apache.cayenne.di.Provider;
+import org.apache.commons.collections.ExtendedProperties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ServerCaseDataSourceInfoProvider implements
Provider<DataSourceInfo> {
- static final String CONNECTION_NAME_KEY = "cayenneTestConnection";
- private static final String DEFAULT_CONNECTION_KEY =
"internal_embedded_datasource";
-
private static Log logger =
LogFactory.getLog(ServerCaseDataSourceInfoProvider.class);
+ private static final String PROPERTIES_FILE = "connection.properties";
+ private static final String CONNECTION_NAME_KEY = "cayenneTestConnection";
+
+ private static final String ADAPTER_KEY_MAVEN = "cayenneAdapter";
+ private static final String USER_NAME_KEY_MAVEN = "cayenneJdbcUsername";
+ private static final String PASSWORD_KEY_MAVEN = "cayenneJdbcPassword";
+ private static final String URL_KEY_MAVEN = "cayenneJdbcUrl";
+ private static final String DRIVER_KEY_MAVEN = "cayenneJdbcDriver";
+
+ private Map<String, DataSourceInfo> inMemoryDataSources;
+ private ConnectionProperties connectionProperties;
+
+ public ServerCaseDataSourceInfoProvider() throws IOException {
+
+ File file = connectionPropertiesFile();
+ ExtendedProperties properties = file.exists() ? new
ExtendedProperties(file.getAbsolutePath())
+ : new ExtendedProperties();
+
+ this.connectionProperties = new ConnectionProperties(properties);
+ logger.info("Loaded " + connectionProperties.size() + " DataSource
configurations from properties file");
+
+ this.inMemoryDataSources = new HashMap<String, DataSourceInfo>();
+
+ // preload default in-memory DataSources. Will use them as defaults if
+ // nothing is configured in ~/.cayenne/connection.properties
+ DataSourceInfo hsqldb = new DataSourceInfo();
+ hsqldb.setAdapterClassName(HSQLDBAdapter.class.getName());
+ hsqldb.setUserName("sa");
+ hsqldb.setPassword("");
+ hsqldb.setDataSourceUrl("jdbc:hsqldb:mem:aname");
+ hsqldb.setJdbcDriver("org.hsqldb.jdbcDriver");
+ inMemoryDataSources.put("hsql", hsqldb);
+
+ DataSourceInfo h2 = new DataSourceInfo();
+ h2.setAdapterClassName(H2Adapter.class.getName());
+ h2.setUserName("sa");
+ h2.setPassword("");
+ h2.setDataSourceUrl("jdbc:h2:mem:aname;MVCC=TRUE");
+ h2.setJdbcDriver("org.h2.Driver");
+ inMemoryDataSources.put("h2", h2);
+
+ DataSourceInfo derby = new DataSourceInfo();
+ derby.setAdapterClassName(DerbyAdapter.class.getName());
+ derby.setUserName("sa");
+ derby.setPassword("");
+ derby.setDataSourceUrl("jdbc:derby:target/testdb;create=true");
+ derby.setJdbcDriver("org.apache.derby.jdbc.EmbeddedDriver");
+ inMemoryDataSources.put("derby", h2);
+ }
+
@Override
public DataSourceInfo get() throws ConfigurationException {
- String connectionKey = System.getProperty(CONNECTION_NAME_KEY);
+ String connectionKey = property(CONNECTION_NAME_KEY);
+ if (connectionKey == null) {
+ connectionKey = "hsql";
+ }
- DataSourceInfo connectionInfo =
ConnectionProperties.getInstance().getConnectionInfo(connectionKey);
+ logger.info("Connection key: " + connectionKey);
+ DataSourceInfo connectionInfo =
connectionProperties.getConnection(connectionKey);
// attempt default if invalid key is specified
if (connectionInfo == null) {
+ connectionInfo = inMemoryDataSources.get(connectionKey);
+ }
- logger.info("Invalid connection key '" + connectionKey + "',
trying default: " + DEFAULT_CONNECTION_KEY);
+ connectionInfo = applyOverrides(connectionInfo);
- connectionInfo =
ConnectionProperties.getInstance().getConnectionInfo(DEFAULT_CONNECTION_KEY);
+ if (connectionInfo == null) {
+ throw new ConfigurationException("No connection info for key: " +
connectionKey);
}
+ logger.info("loaded connection info: " + connectionInfo);
+ return connectionInfo;
+ }
+
+ private File connectionPropertiesFile() {
+ return new File(cayenneUserDir(), PROPERTIES_FILE);
+ }
+
+ private File cayenneUserDir() {
+ File homeDir = new File(System.getProperty("user.home"));
+ return new File(homeDir, ".cayenne");
+ }
+
+ private DataSourceInfo applyOverrides(DataSourceInfo connectionInfo) {
+ String adapter = property(ADAPTER_KEY_MAVEN);
+ String user = property(USER_NAME_KEY_MAVEN);
+ String pass = property(PASSWORD_KEY_MAVEN);
+ String url = property(URL_KEY_MAVEN);
+ String driver = property(DRIVER_KEY_MAVEN);
+
if (connectionInfo == null) {
- throw new RuntimeException("Null connection info for key: " +
connectionKey);
+ // only create a brand new DSI if overrides contains a DB url...
+ if (url == null) {
+ return null;
+ }
+
+ connectionInfo = new DataSourceInfo();
+ }
+
+ connectionInfo = connectionInfo.cloneInfo();
+ if (adapter != null) {
+ connectionInfo.setAdapterClassName(adapter);
+ }
+
+ if (user != null) {
+ connectionInfo.setUserName(user);
+ }
+
+ if (pass != null) {
+ connectionInfo.setPassword(pass);
+ }
+
+ if (url != null) {
+ connectionInfo.setDataSourceUrl(url);
+ }
+
+ if (driver != null) {
+ connectionInfo.setJdbcDriver(driver);
}
- logger.info("loaded connection info: " + connectionInfo);
return connectionInfo;
}
+
+ private String property(String name) {
+ String p = System.getProperty(name);
+ return p == null || p.startsWith("$") ? null : p;
+ }
}
Modified: cayenne/main/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/pom.xml?rev=1542759&r1=1542758&r2=1542759&view=diff
==============================================================================
--- cayenne/main/trunk/pom.xml (original)
+++ cayenne/main/trunk/pom.xml Sun Nov 17 16:34:28 2013
@@ -838,7 +838,7 @@
<activeByDefault>true</activeByDefault>
<property>
<name>cayenneTestConnection</name>
-
<value>internal_embedded_datasource</value>
+ <value>hsql</value>
</property>
</activation>
<dependencies>