diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2013-08-02 20:20:45 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2013-08-02 20:20:45 +1200 |
commit | 0c9878c854000353f6b2f0e55e2887af30dc19ee (patch) | |
tree | fd0cbde3f1d896afc6cd312e38c2910e0b9f517b | |
parent | ee14c8ee6e5fe0e5ede618cf954841a131882196 (diff) | |
download | trackermap-server-0c9878c854000353f6b2f0e55e2887af30dc19ee.tar.gz trackermap-server-0c9878c854000353f6b2f0e55e2887af30dc19ee.tar.bz2 trackermap-server-0c9878c854000353f6b2f0e55e2887af30dc19ee.zip |
Dynamic JDBC driver loading
-rw-r--r-- | default.cfg | 1 | ||||
-rw-r--r-- | src/org/traccar/ServerManager.java | 3 | ||||
-rw-r--r-- | src/org/traccar/helper/DriverDelegate.java | 72 | ||||
-rw-r--r-- | src/org/traccar/model/DatabaseDataManager.java | 23 |
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 |