Skip to content

Commit

Permalink
Dynamic JDBC driver loading
Browse files Browse the repository at this point in the history
  • Loading branch information
tananaev committed Aug 2, 2013
1 parent ee14c8e commit 0c9878c
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 8 deletions.
1 change: 1 addition & 0 deletions default.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<properties>

<!-- Global confiduration -->
<!--<entry key='database.driverFile'>/home/user/Documents/traccar/hsqldb.jar</entry>-->
<entry key='database.driver'>org.h2.Driver</entry>
<entry key='database.dataSource'>org.h2.jdbcx.JdbcDataSource</entry>
<entry key='database.url'>jdbc:h2:/home/user/Documents/traccar/target/database</entry>
Expand Down
3 changes: 1 addition & 2 deletions src/org/traccar/ServerManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ public Properties getProperties() {
return properties;
}

public void init(String[] arguments)
throws IOException, ClassNotFoundException, SQLException {
public void init(String[] arguments) throws Exception {

// Load properties
properties = new Properties();
Expand Down
72 changes: 72 additions & 0 deletions src/org/traccar/helper/DriverDelegate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright 2013 Anton Tananaev ([email protected])
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.traccar.helper;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Properties;
import java.util.logging.Logger;

/**
* Database driver delegate
*/
public class DriverDelegate implements Driver {

private Driver driver;

public DriverDelegate(Driver driver) {
this.driver = driver;
}

@Override
public Connection connect(String url, Properties info) throws SQLException {
return driver.connect(url, info);
}

@Override
public boolean acceptsURL(String url) throws SQLException {
return driver.acceptsURL(url);
}

@Override
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
return driver.getPropertyInfo(url, info);
}

@Override
public int getMajorVersion() {
return driver.getMajorVersion();
}

@Override
public int getMinorVersion() {
return driver.getMinorVersion();
}

@Override
public boolean jdbcCompliant() {
return driver.jdbcCompliant();
}

@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return driver.getParentLogger();
}

}
23 changes: 17 additions & 6 deletions src/org/traccar/model/DatabaseDataManager.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012 Anton Tananaev ([email protected])
* Copyright 2012 - 2013 Anton Tananaev ([email protected])
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -15,18 +15,21 @@
*/
package org.traccar.model;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.*;
import java.util.*;
import org.traccar.helper.AdvancedConnection;
import org.traccar.helper.DriverDelegate;
import org.traccar.helper.NamedParameterStatement;

/**
* Database abstraction class
*/
public class DatabaseDataManager implements DataManager {

public DatabaseDataManager(Properties properties)
throws ClassNotFoundException, SQLException {
public DatabaseDataManager(Properties properties) throws Exception {
initDatabase(properties);
}

Expand All @@ -40,13 +43,21 @@ public DatabaseDataManager(Properties properties)
/**
* Initialize database
*/
private void initDatabase(Properties properties)
throws ClassNotFoundException, SQLException {
private void initDatabase(Properties properties) throws Exception {

// Load driver
String driver = properties.getProperty("database.driver");
if (driver != null) {
Class.forName(driver);
String driverFile = properties.getProperty("database.driverFile");

if (driverFile != null) {
URL url = new URL("jar:file:" + new File(driverFile).getAbsolutePath() + "!/");
URLClassLoader cl = new URLClassLoader(new URL[] { url });
Driver d = (Driver) Class.forName(driver, true, cl).newInstance();
DriverManager.registerDriver(new DriverDelegate(d));
} else {
Class.forName(driver);
}
}

// Refresh delay
Expand Down

0 comments on commit 0c9878c

Please sign in to comment.