aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2013-08-02 20:20:45 +1200
committerAnton Tananaev <anton.tananaev@gmail.com>2013-08-02 20:20:45 +1200
commit0c9878c854000353f6b2f0e55e2887af30dc19ee (patch)
treefd0cbde3f1d896afc6cd312e38c2910e0b9f517b
parentee14c8ee6e5fe0e5ede618cf954841a131882196 (diff)
downloadtrackermap-server-0c9878c854000353f6b2f0e55e2887af30dc19ee.tar.gz
trackermap-server-0c9878c854000353f6b2f0e55e2887af30dc19ee.tar.bz2
trackermap-server-0c9878c854000353f6b2f0e55e2887af30dc19ee.zip
Dynamic JDBC driver loading
-rw-r--r--default.cfg1
-rw-r--r--src/org/traccar/ServerManager.java3
-rw-r--r--src/org/traccar/helper/DriverDelegate.java72
-rw-r--r--src/org/traccar/model/DatabaseDataManager.java23
4 files changed, 91 insertions, 8 deletions
diff --git a/default.cfg b/default.cfg
index aa6082299..47c9233c5 100644
--- a/default.cfg
+++ b/default.cfg
@@ -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>
diff --git a/src/org/traccar/ServerManager.java b/src/org/traccar/ServerManager.java
index a32a49572..b5e061aee 100644
--- a/src/org/traccar/ServerManager.java
+++ b/src/org/traccar/ServerManager.java
@@ -89,8 +89,7 @@ public class ServerManager {
return properties;
}
- public void init(String[] arguments)
- throws IOException, ClassNotFoundException, SQLException {
+ public void init(String[] arguments) throws Exception {
// Load properties
properties = new Properties();
diff --git a/src/org/traccar/helper/DriverDelegate.java b/src/org/traccar/helper/DriverDelegate.java
new file mode 100644
index 000000000..ccce28afe
--- /dev/null
+++ b/src/org/traccar/helper/DriverDelegate.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * 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();
+ }
+
+}
diff --git a/src/org/traccar/model/DatabaseDataManager.java b/src/org/traccar/model/DatabaseDataManager.java
index 7b98b73fb..ce781da1a 100644
--- a/src/org/traccar/model/DatabaseDataManager.java
+++ b/src/org/traccar/model/DatabaseDataManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 Anton Tananaev (anton.tananaev@gmail.com)
+ * Copyright 2012 - 2013 Anton Tananaev (anton.tananaev@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,9 +15,13 @@
*/
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;
/**
@@ -25,8 +29,7 @@ import org.traccar.helper.NamedParameterStatement;
*/
public class DatabaseDataManager implements DataManager {
- public DatabaseDataManager(Properties properties)
- throws ClassNotFoundException, SQLException {
+ public DatabaseDataManager(Properties properties) throws Exception {
initDatabase(properties);
}
@@ -40,13 +43,21 @@ public class DatabaseDataManager implements DataManager {
/**
* 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