diff --git main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java index 45e1e0e..49c6a60 100644 --- main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java +++ main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java @@ -45,7 +45,8 @@ public class DefaultJDBCLock implements Lock { private static final String PROPERTY_LOCK_JDBC_TABLE = "karaf.lock.jdbc.table"; private static final String PROPERTY_LOCK_JDBC_CLUSTERNAME = "karaf.lock.jdbc.clustername"; private static final String PROPERTY_LOCK_JDBC_TIMEOUT = "karaf.lock.jdbc.timeout"; - + private static final String PROPERTY_LOCK_JDBC_CONNECTION_PROPERTIES = "karaf.lock.jdbc.connection.properties"; + private static final String DEFAULT_PASSWORD = ""; private static final String DEFAULT_USER = ""; private static final String DEFAULT_TABLE = "KARAF_LOCK"; @@ -61,6 +62,7 @@ public class DefaultJDBCLock implements Lock { String table; String clusterName; int timeout; + Properties connectionProperties; public DefaultJDBCLock(Properties props) { try{ @@ -75,12 +77,30 @@ public class DefaultJDBCLock implements Lock { this.table = props.getProperty(PROPERTY_LOCK_JDBC_TABLE, DEFAULT_TABLE); this.clusterName = props.getProperty(PROPERTY_LOCK_JDBC_CLUSTERNAME, DEFAULT_CLUSTERNAME); this.timeout = Integer.parseInt(props.getProperty(PROPERTY_LOCK_JDBC_TIMEOUT, DEFAULT_TIMEOUT)); + this.connectionProperties = extractConnectionProperties(props.getProperty(PROPERTY_LOCK_JDBC_CONNECTION_PROPERTIES)); this.statements = createStatements(); init(); } - + + private Properties extractConnectionProperties(String connProps) { + if (connProps == null || connProps.trim().isEmpty()) { + return null; + } + + connectionProperties = new Properties(); + connectionProperties.setProperty("user", user); + connectionProperties.setProperty("password", password); + String[] properties = connProps.split(";"); + for (String property : properties) { + String[] pair = property.split("="); + connectionProperties.setProperty(pair[0], pair[1]); + } + + return connectionProperties; + } + Statements createStatements() { Statements statements = new Statements(); statements.setTableName(table); @@ -252,7 +272,7 @@ public class DefaultJDBCLock implements Lock { Connection getConnection() throws Exception { if (!isConnected()) { - lockConnection = createConnection(driver, url, user, password); + lockConnection = createConnection(driver, url, user, password, connectionProperties); lockConnection.setAutoCommit(false); } @@ -266,16 +286,17 @@ public class DefaultJDBCLock implements Lock { * @param url * @param username * @param password + * @param connectionProperties * @return a new jdbc connection * @throws Exception */ - Connection createConnection(String driver, String url, String username, String password) throws Exception { + Connection createConnection(String driver, String url, String username, String password, Properties connectionProperties) throws Exception { if (url.toLowerCase().startsWith("jdbc:derby")) { url = (url.toLowerCase().contains("create=true")) ? url : url + ";create=true"; } try { - return doCreateConnection(driver, url, username, password); + return doCreateConnection(driver, url, username, password, connectionProperties); } catch (Exception e) { LOG.severe("Error occured while setting up JDBC connection: " + e); throw e; @@ -289,14 +310,19 @@ public class DefaultJDBCLock implements Lock { * @param url * @param username * @param password + * @param connectionProperties * @return * @throws ClassNotFoundException * @throws SQLException */ - Connection doCreateConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connectionProperties) throws ClassNotFoundException, SQLException { Class.forName(driver); // results in a closed connection in Derby if the update lock table request timed out // DriverManager.setLoginTimeout(timeout); + if (connectionProperties != null) { + return DriverManager.getConnection(url, connectionProperties); + } + return DriverManager.getConnection(url, username, password); } diff --git main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java index 722bdce..3d718c7 100644 --- main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java +++ main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java @@ -33,9 +33,9 @@ public class DerbyJDBCLock extends DefaultJDBCLock { } @Override - Connection createConnection(String driver, String url, String username, String password) throws Exception { + Connection createConnection(String driver, String url, String username, String password, Properties connProps) throws Exception { url = (url.toLowerCase().contains("create=true")) ? url : url + ";create=true"; - return super.createConnection(driver, url, username, password); + return super.createConnection(driver, url, username, password, connProps); } } diff --git main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java index 597491c..8af91a1 100644 --- main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java +++ main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java @@ -46,13 +46,13 @@ public class MySQLJDBCLock extends DefaultJDBCLock { } @Override - Connection createConnection(String driver, String url, String username, String password) throws Exception { + Connection createConnection(String driver, String url, String username, String password, Properties connProps) throws Exception { url = (url.toLowerCase().contains("createDatabaseIfNotExist=true")) ? url : ((url.contains("?")) ? url + "&createDatabaseIfNotExist=true" : url + "?createDatabaseIfNotExist=true"); - return super.createConnection(driver, url, username, password); + return super.createConnection(driver, url, username, password, connProps); } } diff --git main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java index a45c4a2..e6f3057 100644 --- main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java +++ main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java @@ -47,6 +47,7 @@ public abstract class BaseJDBCLockTest { String tableName = "LOCK_TABLE"; String clustername = "karaf_cluster"; int timeout = 10; + String connProps = ""; String momentDatatype = "BIGINT"; String nodeDatatype = "VARCHAR(20)"; String createTableStmtSuffix = ""; @@ -82,6 +83,7 @@ public abstract class BaseJDBCLockTest { props.put("karaf.lock.jdbc.table", tableName); props.put("karaf.lock.jdbc.clustername", clustername); props.put("karaf.lock.jdbc.timeout", timeout); + props.put("karaf.lock.jdbc.connection.properties", connProps); } @Test diff --git main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java index eaafe3d..e0d7c47 100644 --- main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java +++ main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java @@ -43,11 +43,12 @@ public class DefaultJDBCLockTest extends BaseJDBCLockTest { DefaultJDBCLock createLock(Properties props) { return new DefaultJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url + ";create=true", url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } @@ -64,11 +65,39 @@ public class DefaultJDBCLockTest extends BaseJDBCLockTest { lock = new DefaultJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url + ";create=true", url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); + return connection; + } + + @Override + long getCurrentTimeMillis() { + return 1; + } + }; + } + + @Test + public void createConnectionShouldRespectAdditionalConnectionProperties() { + props.put("karaf.lock.jdbc.connection.properties", "encryption=REQUIRED;encryption_type=AES256"); + + lock = new DefaultJDBCLock(props) { + @Override + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { + assertEquals(this.driver, driver); + assertEquals(this.url + ";create=true", url); + assertEquals(this.user, username); + assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); + assertEquals(4, connProps.size()); + assertEquals(this.user, connProps.get("user")); + assertEquals(this.password, connProps.get("password")); + assertEquals("REQUIRED", connProps.get("encryption")); + assertEquals("AES256", connProps.get("encryption_type")); return connection; } diff --git main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java index bd6fcec..bb3882c 100644 --- main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java +++ main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java @@ -43,11 +43,12 @@ public class DerbyJDBCLockTest extends BaseJDBCLockTest { DerbyJDBCLock createLock(Properties props) { return new DerbyJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url + ";create=true", url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } @@ -64,11 +65,12 @@ public class DerbyJDBCLockTest extends BaseJDBCLockTest { lock = new DerbyJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url + ";create=true", url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } diff --git main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java index c49e434..fa8663a 100644 --- main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java +++ main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java @@ -43,11 +43,12 @@ public class MySQLJDBCLockTest extends BaseJDBCLockTest { MySQLJDBCLock createLock(Properties props) { return new MySQLJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url + "?createDatabaseIfNotExist=true", url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } @@ -64,11 +65,12 @@ public class MySQLJDBCLockTest extends BaseJDBCLockTest { lock = new MySQLJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url + "&createDatabaseIfNotExist=true", url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } diff --git main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java index a2242a1..c0848e0 100644 --- main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java +++ main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java @@ -49,11 +49,12 @@ public class OracleJDBCLockTest extends BaseJDBCLockTest { OracleJDBCLock createLock(Properties props) { return new OracleJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url, url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } diff --git main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java index 20aba82..0041c19 100644 --- main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java +++ main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java @@ -46,11 +46,12 @@ public class PostgreSQLJDBCLockTest extends BaseJDBCLockTest { DefaultJDBCLock createLock(Properties props) { return new PostgreSQLJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url, url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; } @@ -67,11 +68,12 @@ public class PostgreSQLJDBCLockTest extends BaseJDBCLockTest { lock = new PostgreSQLJDBCLock(props) { @Override - Connection doCreateConnection(String driver, String url, String username, String password) { + Connection doCreateConnection(String driver, String url, String username, String password, Properties connProps) { assertEquals(this.driver, driver); assertEquals(this.url, url); assertEquals(this.user, username); assertEquals(this.password, password); + assertEquals(this.connectionProperties, connProps); return connection; }