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>


Reply via email to