From 4f5f815f88e81000510ef2544e3e392fd7465d8e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Oct 2014 13:24:47 +1300 Subject: Integrate c3p0 database library --- default.cfg | 1 - pom.xml | 5 + src/org/traccar/BasePipelineFactory.java | 2 +- src/org/traccar/BaseProtocolDecoder.java | 2 +- src/org/traccar/ServerManager.java | 7 +- src/org/traccar/TrackerEventHandler.java | 2 +- src/org/traccar/database/DataManager.java | 232 ++++++++++++++++++ .../traccar/database/NamedParameterStatement.java | 166 +++++++++++++ src/org/traccar/helper/AdvancedConnection.java | 61 ----- .../traccar/helper/NamedParameterStatement.java | 259 --------------------- src/org/traccar/http/WebServer.java | 48 +--- src/org/traccar/model/DataManager.java | 37 --- src/org/traccar/model/DatabaseDataManager.java | 202 ---------------- src/org/traccar/protocol/ApelProtocolDecoder.java | 10 +- .../traccar/protocol/ProgressProtocolDecoder.java | 20 +- test/org/traccar/helper/TestDataManager.java | 18 +- 16 files changed, 430 insertions(+), 642 deletions(-) create mode 100644 src/org/traccar/database/DataManager.java create mode 100644 src/org/traccar/database/NamedParameterStatement.java delete mode 100644 src/org/traccar/helper/AdvancedConnection.java delete mode 100644 src/org/traccar/helper/NamedParameterStatement.java delete mode 100644 src/org/traccar/model/DataManager.java delete mode 100644 src/org/traccar/model/DatabaseDataManager.java diff --git a/default.cfg b/default.cfg index a684f7631..4983bac16 100644 --- a/default.cfg +++ b/default.cfg @@ -7,7 +7,6 @@ org.h2.Driver - org.h2.jdbcx.JdbcDataSource jdbc:h2:/home/user/Documents/traccar/target/database sa diff --git a/pom.xml b/pom.xml index 86c0e4fc4..6ede1e533 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,11 @@ postgresql 9.3-1102-jdbc4 + + com.mchange + c3p0 + 0.9.2.1 + io.netty netty diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java index e1f1e10e5..83207b91f 100644 --- a/src/org/traccar/BasePipelineFactory.java +++ b/src/org/traccar/BasePipelineFactory.java @@ -23,7 +23,7 @@ import org.jboss.netty.handler.logging.LoggingHandler; import org.jboss.netty.handler.timeout.IdleStateHandler; import org.traccar.geocode.ReverseGeocoder; import org.traccar.helper.Log; -import org.traccar.model.DataManager; +import org.traccar.database.DataManager; /** * Base pipeline factory diff --git a/src/org/traccar/BaseProtocolDecoder.java b/src/org/traccar/BaseProtocolDecoder.java index 447bf364b..e23367278 100644 --- a/src/org/traccar/BaseProtocolDecoder.java +++ b/src/org/traccar/BaseProtocolDecoder.java @@ -22,7 +22,7 @@ import org.jboss.netty.channel.ChannelHandlerContext; import static org.jboss.netty.channel.Channels.fireMessageReceived; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; -import org.traccar.model.DataManager; +import org.traccar.database.DataManager; /** * Base class for protocol decoders diff --git a/src/org/traccar/ServerManager.java b/src/org/traccar/ServerManager.java index 7c085d0be..2d3788720 100644 --- a/src/org/traccar/ServerManager.java +++ b/src/org/traccar/ServerManager.java @@ -40,8 +40,7 @@ import org.traccar.geocode.NominatimReverseGeocoder; import org.traccar.geocode.ReverseGeocoder; import org.traccar.helper.Log; import org.traccar.http.WebServer; -import org.traccar.model.DataManager; -import org.traccar.model.DatabaseDataManager; +import org.traccar.database.DataManager; import org.traccar.protocol.*; /** @@ -99,7 +98,7 @@ public class ServerManager { Log.setupLogger(properties); } - dataManager = new DatabaseDataManager(properties); + dataManager = new DataManager(properties); initGeocoder(properties); @@ -178,7 +177,7 @@ public class ServerManager { // Initialize web server if (Boolean.valueOf(properties.getProperty("http.enable"))) { - webServer = new WebServer(properties); + webServer = new WebServer(properties, dataManager.getDataSource()); } } diff --git a/src/org/traccar/TrackerEventHandler.java b/src/org/traccar/TrackerEventHandler.java index 5387074dc..878b3ba70 100644 --- a/src/org/traccar/TrackerEventHandler.java +++ b/src/org/traccar/TrackerEventHandler.java @@ -20,7 +20,7 @@ import org.jboss.netty.channel.*; import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler; import org.jboss.netty.handler.timeout.IdleStateEvent; import org.traccar.helper.Log; -import org.traccar.model.DataManager; +import org.traccar.database.DataManager; import org.traccar.model.Position; /** diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java new file mode 100644 index 000000000..27f4cb5c2 --- /dev/null +++ b/src/org/traccar/database/DataManager.java @@ -0,0 +1,232 @@ +/* + * Copyright 2012 - 2014 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.database; + +import com.mchange.v2.c3p0.ComboPooledDataSource; +import java.io.File; +import java.io.StringReader; +import java.net.URL; +import java.net.URLClassLoader; +import java.sql.*; +import java.util.*; +import javax.sql.DataSource; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; +import org.traccar.helper.DriverDelegate; +import org.traccar.helper.Log; +import org.traccar.model.Device; +import org.traccar.model.Position; +import org.xml.sax.InputSource; + +/** + * Database abstraction class + */ +public class DataManager { + + public DataManager(Properties properties) throws Exception { + if (properties != null) { + initDatabase(properties); + } + } + + private DataSource dataSource; + + public DataSource getDataSource() { + return dataSource; + } + + /** + * Database statements + */ + private NamedParameterStatement queryGetDevices; + private NamedParameterStatement queryAddPosition; + private NamedParameterStatement queryUpdateLatestPosition; + + /** + * Initialize database + */ + private void initDatabase(Properties properties) throws Exception { + + // Load driver + String driver = properties.getProperty("database.driver"); + if (driver != null) { + 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); + } + } + + // Initialize data source + ComboPooledDataSource ds = new ComboPooledDataSource(); + ds.setDriverClass(properties.getProperty("database.driver")); + ds.setJdbcUrl(properties.getProperty("database.url")); + ds.setUser(properties.getProperty("database.user")); + ds.setPassword(properties.getProperty("database.password")); + ds.setIdleConnectionTestPeriod(600); + ds.setTestConnectionOnCheckin(true); + dataSource = ds; + + // Load statements from configuration + String query; + + query = properties.getProperty("database.selectDevice"); + if (query != null) { + queryGetDevices = new NamedParameterStatement(query); + } + + query = properties.getProperty("database.insertPosition"); + if (query != null) { + queryAddPosition = new NamedParameterStatement(query); + } + + query = properties.getProperty("database.updateLatestPosition"); + if (query != null) { + queryUpdateLatestPosition = new NamedParameterStatement(query); + } + } + + public synchronized List getDevices() throws SQLException { + + List deviceList = new LinkedList(); + + if (queryGetDevices != null) { + Connection connection = dataSource.getConnection(); + try { + PreparedStatement statement = queryGetDevices.prepare(connection); + try { + ResultSet result = statement.executeQuery(); + while (result.next()) { + Device device = new Device(); + device.setId(result.getLong("id")); + device.setImei(result.getString("imei")); + deviceList.add(device); + } + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } + + return deviceList; + } + + /** + * Devices cache + */ + private Map devices; + + public Device getDeviceByImei(String imei) throws SQLException { + + if (devices == null || !devices.containsKey(imei)) { + devices = new HashMap(); + for (Device device : getDevices()) { + devices.put(device.getImei(), device); + } + } + + return devices.get(imei); + } + + public synchronized Long addPosition(Position position) throws SQLException { + + if (queryAddPosition != null) { + Connection connection = dataSource.getConnection(); + try { + PreparedStatement statement = queryAddPosition.prepare(connection, Statement.RETURN_GENERATED_KEYS); + try { + assignVariables(queryAddPosition, statement, position); + statement.executeUpdate(); + + ResultSet result = statement.getGeneratedKeys(); + if (result != null && result.next()) { + return result.getLong(1); + } + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } + + return null; + } + + public void updateLatestPosition(Position position, Long positionId) throws SQLException { + if (queryUpdateLatestPosition != null) { + Connection connection = dataSource.getConnection(); + try { + PreparedStatement statement = queryUpdateLatestPosition.prepare(connection); + try { + assignVariables(queryUpdateLatestPosition, statement, position); + queryUpdateLatestPosition.setLong(statement, "id", positionId); + statement.executeUpdate(); + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } + } + + private void assignVariables(NamedParameterStatement nps, PreparedStatement ps, Position position) throws SQLException { + + nps.setLong(ps, "device_id", position.getDeviceId()); + nps.setTimestamp(ps, "time", position.getTime()); + nps.setBoolean(ps, "valid", position.getValid()); + nps.setDouble(ps, "altitude", position.getAltitude()); + nps.setDouble(ps, "latitude", position.getLatitude()); + nps.setDouble(ps, "longitude", position.getLongitude()); + nps.setDouble(ps, "speed", position.getSpeed()); + nps.setDouble(ps, "course", position.getCourse()); + nps.setString(ps, "address", position.getAddress()); + nps.setString(ps, "extended_info", position.getExtendedInfo()); + + // DELME: Temporary compatibility support + XPath xpath = XPathFactory.newInstance().newXPath(); + try { + InputSource source = new InputSource(new StringReader(position.getExtendedInfo())); + String index = xpath.evaluate("/info/index", source); + if (!index.isEmpty()) { + nps.setLong(ps, "id", Long.valueOf(index)); + } else { + nps.setLong(ps, "id", null); + } + source = new InputSource(new StringReader(position.getExtendedInfo())); + String power = xpath.evaluate("/info/power", source); + if (!power.isEmpty()) { + nps.setDouble(ps, "power", Double.valueOf(power)); + } else { + nps.setLong(ps, "power", null); + } + } catch (XPathExpressionException e) { + Log.warning("Error in XML: " + position.getExtendedInfo(), e); + nps.setLong(ps, "id", null); + nps.setLong(ps, "power", null); + } + } + +} diff --git a/src/org/traccar/database/NamedParameterStatement.java b/src/org/traccar/database/NamedParameterStatement.java new file mode 100644 index 000000000..850462b2c --- /dev/null +++ b/src/org/traccar/database/NamedParameterStatement.java @@ -0,0 +1,166 @@ +/* + * Copyright 2012 - 2014 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.database; + +import java.sql.*; +import java.util.*; +import java.util.Date; + +public class NamedParameterStatement { + + private final Map> indexMap; + + private final String parsedQuery; + + public NamedParameterStatement(String query) { + indexMap = new HashMap>(); + parsedQuery = parse(query, indexMap); + } + + static String parse(String query, Map> paramMap) { + + int length = query.length(); + StringBuilder parsedQuery = new StringBuilder(length); + boolean inSingleQuote = false; + boolean inDoubleQuote = false; + int index = 1; + + for(int i = 0; i < length; i++) { + + char c = query.charAt(i); + + // String end + if (inSingleQuote) { + if (c == '\'') inSingleQuote = false; + } else if (inDoubleQuote) { + if (c == '"') inDoubleQuote = false; + } else { + + // String begin + if (c == '\'') { + inSingleQuote = true; + } else if (c == '"') { + inDoubleQuote = true; + } else if (c == ':' && i + 1 < length && + Character.isJavaIdentifierStart(query.charAt(i + 1))) { + + // Identifier name + int j = i + 2; + while (j < length && Character.isJavaIdentifierPart(query.charAt(j))) j++; + + String name = query.substring(i + 1, j); + c = '?'; + i += name.length(); + + // Add to list + List indexList = paramMap.get(name); + if (indexList == null) { + indexList = new LinkedList(); + paramMap.put(name, indexList); + } + indexList.add(index); + + index++; + } + } + + parsedQuery.append(c); + } + + return parsedQuery.toString(); + } + + public PreparedStatement prepare(Connection connection, int autoGeneratedKeys) throws SQLException { + return connection.prepareStatement(parsedQuery, autoGeneratedKeys); + } + + public PreparedStatement prepare(Connection connection) throws SQLException { + return prepare(connection, Statement.NO_GENERATED_KEYS); + } + + public void setInt(PreparedStatement statement, String name, Integer value) throws SQLException { + + List indexList = indexMap.get(name); + if (indexList != null) for (Integer index: indexList) { + if (value != null) { + statement.setInt(index, value); + } else { + statement.setNull(index, Types.INTEGER); + } + } + } + + public void setLong(PreparedStatement statement, String name, Long value) throws SQLException { + + List indexList = indexMap.get(name); + if (indexList != null) for (Integer index: indexList) { + if (value != null) { + statement.setLong(index, value); + } else { + statement.setNull(index, Types.INTEGER); + } + } + } + + public void setBoolean(PreparedStatement statement, String name, Boolean value) throws SQLException { + + List indexList = indexMap.get(name); + if (indexList != null) for (Integer index: indexList) { + if (value != null) { + statement.setBoolean(index, value); + } else { + statement.setNull(index, Types.BOOLEAN); + } + } + } + + public void setDouble(PreparedStatement statement, String name, Double value) throws SQLException { + + List indexList = indexMap.get(name); + if (indexList != null) for (Integer index: indexList) { + if (value != null) { + statement.setDouble(index, value); + } else { + statement.setNull(index, Types.DOUBLE); + } + } + } + + public void setTimestamp(PreparedStatement statement, String name, Date value) throws SQLException { + + List indexList = indexMap.get(name); + if (indexList != null) for (Integer index: indexList) { + if (value != null) { + statement.setTimestamp(index, new Timestamp(value.getTime())); + } else { + statement.setNull(index, Types.TIMESTAMP); + } + } + } + + public void setString(PreparedStatement statement, String name, String value) throws SQLException { + + List indexList = indexMap.get(name); + if (indexList != null) for (Integer index: indexList) { + if (value != null) { + statement.setString(index, value); + } else { + statement.setNull(index, Types.VARCHAR); + } + } + } + +} diff --git a/src/org/traccar/helper/AdvancedConnection.java b/src/org/traccar/helper/AdvancedConnection.java deleted file mode 100644 index c0126974b..000000000 --- a/src/org/traccar/helper/AdvancedConnection.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2012 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.DriverManager; -import java.sql.SQLException; - -public class AdvancedConnection { - - /** - * Database connection - */ - private Connection connection; - - /** - * Connection attributes - */ - private String url; - private String user; - private String password; - - public AdvancedConnection(String url, String user, String password) { - this.url = url; - this.user = user; - this.password = password; - } - - public final void reset() throws SQLException { - if (connection != null) { - connection.close(); - connection = null; - } - if (user != null && password != null) { - connection = DriverManager.getConnection(url, user, password); - } else { - connection = DriverManager.getConnection(url); - } - } - - public Connection getInstance() throws SQLException { - if (connection == null) { - reset(); - } - return connection; - } - -} diff --git a/src/org/traccar/helper/NamedParameterStatement.java b/src/org/traccar/helper/NamedParameterStatement.java deleted file mode 100644 index f66d8c4dd..000000000 --- a/src/org/traccar/helper/NamedParameterStatement.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2012 - 2014 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.*; -import java.util.*; -import java.util.Date; - -public class NamedParameterStatement { - - /** - * Native statement - */ - private PreparedStatement statement; - - /** - * Index mapping - */ - private final Map> indexMap; - - /** - * Query string - */ - private final String parsedQuery; - - /** - * Database connection - */ - private final AdvancedConnection connection; - - private int autoGeneratedKeys; - - private boolean failed; - - /** - * Initialize statement - */ - public NamedParameterStatement(AdvancedConnection connection, String query) { - - indexMap = new HashMap>(); - parsedQuery = parse(query, indexMap); - this.connection = connection; - } - - /** - * Parse query - */ - static String parse(String query, Map> paramMap) { - - int length = query.length(); - StringBuilder parsedQuery = new StringBuilder(length); - boolean inSingleQuote = false; - boolean inDoubleQuote = false; - int index = 1; - - for(int i = 0; i < length; i++) { - - char c = query.charAt(i); - - // String end - if (inSingleQuote) { - if (c == '\'') inSingleQuote = false; - } else if (inDoubleQuote) { - if (c == '"') inDoubleQuote = false; - } else { - - // String begin - if (c == '\'') { - inSingleQuote = true; - } else if (c == '"') { - inDoubleQuote = true; - } else if (c == ':' && i + 1 < length && - Character.isJavaIdentifierStart(query.charAt(i + 1))) { - - // Identifier name - int j = i + 2; - while (j < length && Character.isJavaIdentifierPart(query.charAt(j))) j++; - - String name = query.substring(i + 1, j); - c = '?'; - i += name.length(); - - // Add to list - List indexList = paramMap.get(name); - if (indexList == null) { - indexList = new LinkedList(); - paramMap.put(name, indexList); - } - indexList.add(index); - - index++; - } - } - - parsedQuery.append(c); - } - - return parsedQuery.toString(); - } - - public void reset(boolean resetConnection) throws SQLException { - if (statement != null) { - statement.close(); - statement = null; - } - if (resetConnection) { - connection.reset(); - } - statement = connection.getInstance().prepareStatement(parsedQuery, autoGeneratedKeys); - failed = false; - } - - public void prepare(int autoGeneratedKeys) throws SQLException { - this.autoGeneratedKeys = autoGeneratedKeys; - try { - if (statement == null) { - reset(false); - } else if (failed || statement.getWarnings() != null) { - reset(true); - } - } catch (SQLException firstError) { - try { - reset(true); - } catch (SQLException secondError) { - Log.warning(secondError); - failed = true; - throw secondError; - } - } - } - - public void prepare() throws SQLException { - prepare(Statement.NO_GENERATED_KEYS); - } - - /** - * Execute query with result - */ - public ResultSet executeQuery() throws SQLException { - try { - return statement.executeQuery(); - } catch (SQLException error) { - failed = true; - throw error; - } - } - - /** - * Executes query without result - */ - public int executeUpdate() throws SQLException { - try { - return statement.executeUpdate(); - } catch (SQLException error) { - failed = true; - throw error; - } - } - - /** - * Return generated keys - */ - public ResultSet getGeneratedKeys() throws SQLException { - return statement.getGeneratedKeys(); - } - - /** - * Immediately closes the statement - */ - public void close() throws SQLException { - statement.close(); - } - - public void setInt(String name, Integer value) throws SQLException { - - List indexList = indexMap.get(name); - if (indexList != null) for (Integer index: indexList) { - if (value != null) { - statement.setInt(index, value); - } else { - statement.setNull(index, Types.INTEGER); - } - } - } - - public void setLong(String name, Long value) throws SQLException { - - List indexList = indexMap.get(name); - if (indexList != null) for (Integer index: indexList) { - if (value != null) { - statement.setLong(index, value); - } else { - statement.setNull(index, Types.INTEGER); - } - } - } - - public void setBoolean(String name, Boolean value) throws SQLException { - - List indexList = indexMap.get(name); - if (indexList != null) for (Integer index: indexList) { - if (value != null) { - statement.setBoolean(index, value); - } else { - statement.setNull(index, Types.BOOLEAN); - } - } - } - - public void setDouble(String name, Double value) throws SQLException { - - List indexList = indexMap.get(name); - if (indexList != null) for (Integer index: indexList) { - if (value != null) { - statement.setDouble(index, value); - } else { - statement.setNull(index, Types.DOUBLE); - } - } - } - - public void setTimestamp(String name, Date value) throws SQLException { - - List indexList = indexMap.get(name); - if (indexList != null) for (Integer index: indexList) { - if (value != null) { - statement.setTimestamp(index, new Timestamp(value.getTime())); - } else { - statement.setNull(index, Types.TIMESTAMP); - } - } - } - - public void setString(String name, String value) throws SQLException { - - List indexList = indexMap.get(name); - if (indexList != null) for (Integer index: indexList) { - if (value != null) { - statement.setString(index, value); - } else { - statement.setNull(index, Types.VARCHAR); - } - } - } - -} diff --git a/src/org/traccar/http/WebServer.java b/src/org/traccar/http/WebServer.java index 2745cd7b8..9a7cb9e4e 100644 --- a/src/org/traccar/http/WebServer.java +++ b/src/org/traccar/http/WebServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2012 - 2014 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,10 +15,7 @@ */ package org.traccar.http; -import java.io.File; import java.net.InetSocketAddress; -import java.net.URL; -import java.net.URLClassLoader; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; @@ -34,41 +31,7 @@ public class WebServer { private Server server; - private void initDataSource(Properties properties) { - try { - - Context context = new InitialContext(); - - String dataSourceClass = properties.getProperty("database.dataSource"); - if (dataSourceClass != null) { - - Class clazz; - - 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 }); - clazz = Class.forName(dataSourceClass, true, cl); - } else { - clazz = Class.forName(dataSourceClass); - } - - if (clazz != null) { - DataSource ds = (DataSource) clazz.newInstance(); - clazz.getMethod("setURL", String.class).invoke(ds, properties.getProperty("database.url")); - clazz.getMethod("setUser", String.class).invoke(ds, properties.getProperty("database.user")); - clazz.getMethod("setPassword", String.class).invoke(ds, properties.getProperty("database.password")); - - context.bind("java:/DefaultDS", ds); - } - } - - } catch (Exception error) { - Log.warning(error); - } - } - - public WebServer(Properties properties) { + public WebServer(Properties properties, DataSource dataSource) { String address = properties.getProperty("http.address"); Integer port = Integer.valueOf(properties.getProperty("http.port", "8082")); if (address == null) { @@ -77,7 +40,12 @@ public class WebServer { server = new Server(new InetSocketAddress(address, port)); } - initDataSource(properties); + try { + Context context = new InitialContext(); + context.bind("java:/DefaultDS", dataSource); + } catch (Exception error) { + Log.warning(error); + } WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); diff --git a/src/org/traccar/model/DataManager.java b/src/org/traccar/model/DataManager.java deleted file mode 100644 index f0bfdb50d..000000000 --- a/src/org/traccar/model/DataManager.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012 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.model; - -import java.util.List; - -/** - * Data manager - */ -public interface DataManager { - - /** - * Manage devices - */ - public List getDevices() throws Exception; - public Device getDeviceByImei(String imei) throws Exception; - - /** - * Manage positions - */ - public Long addPosition(Position position) throws Exception; - public void updateLatestPosition(Position position, Long positionId) throws Exception; - -} diff --git a/src/org/traccar/model/DatabaseDataManager.java b/src/org/traccar/model/DatabaseDataManager.java deleted file mode 100644 index f8d8806a7..000000000 --- a/src/org/traccar/model/DatabaseDataManager.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright 2012 - 2014 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.model; - -import java.io.File; -import java.io.StringReader; -import java.net.URL; -import java.net.URLClassLoader; -import java.sql.*; -import java.util.*; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import org.traccar.helper.AdvancedConnection; -import org.traccar.helper.DriverDelegate; -import org.traccar.helper.Log; -import org.traccar.helper.NamedParameterStatement; -import org.xml.sax.InputSource; - -/** - * Database abstraction class - */ -public class DatabaseDataManager implements DataManager { - - public DatabaseDataManager(Properties properties) throws Exception { - initDatabase(properties); - } - - /** - * Database statements - */ - private NamedParameterStatement queryGetDevices; - private NamedParameterStatement queryAddPosition; - private NamedParameterStatement queryUpdateLatestPosition; - - /** - * Initialize database - */ - private void initDatabase(Properties properties) throws Exception { - - // Load driver - String driver = properties.getProperty("database.driver"); - if (driver != null) { - 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); - } - } - - // Connect database - String url = properties.getProperty("database.url"); - String user = properties.getProperty("database.user"); - String password = properties.getProperty("database.password"); - AdvancedConnection connection = new AdvancedConnection(url, user, password); - - // Load statements from configuration - String query; - - query = properties.getProperty("database.selectDevice"); - if (query != null) { - queryGetDevices = new NamedParameterStatement(connection, query); - } - - query = properties.getProperty("database.insertPosition"); - if (query != null) { - queryAddPosition = new NamedParameterStatement(connection, query); - } - - query = properties.getProperty("database.updateLatestPosition"); - if (query != null) { - queryUpdateLatestPosition = new NamedParameterStatement(connection, query); - } - } - - @Override - public synchronized List getDevices() throws SQLException { - - List deviceList = new LinkedList(); - - if (queryGetDevices != null) { - queryGetDevices.prepare(); - ResultSet result = queryGetDevices.executeQuery(); - while (result.next()) { - Device device = new Device(); - device.setId(result.getLong("id")); - device.setImei(result.getString("imei")); - deviceList.add(device); - } - } - - return deviceList; - } - - /** - * Devices cache - */ - private Map devices; - - @Override - public Device getDeviceByImei(String imei) throws SQLException { - - if (devices == null || !devices.containsKey(imei)) { - devices = new HashMap(); - for (Device device : getDevices()) { - devices.put(device.getImei(), device); - } - } - - return devices.get(imei); - } - - @Override - public synchronized Long addPosition(Position position) throws SQLException { - - if (queryAddPosition != null) { - queryAddPosition.prepare(Statement.RETURN_GENERATED_KEYS); - - queryAddPosition = assignVariables(queryAddPosition, position); - - queryAddPosition.executeUpdate(); - - ResultSet result = queryAddPosition.getGeneratedKeys(); - if (result != null && result.next()) { - return result.getLong(1); - } - } - - return null; - } - - @Override - public void updateLatestPosition(Position position, Long positionId) throws SQLException { - if (queryUpdateLatestPosition != null) { - queryUpdateLatestPosition.prepare(); - - queryUpdateLatestPosition = assignVariables(queryUpdateLatestPosition, position); - queryUpdateLatestPosition.setLong("id", positionId); - - queryUpdateLatestPosition.executeUpdate(); - } - } - - private NamedParameterStatement assignVariables(NamedParameterStatement preparedStatement, Position position) throws SQLException { - - preparedStatement.setLong("device_id", position.getDeviceId()); - preparedStatement.setTimestamp("time", position.getTime()); - preparedStatement.setBoolean("valid", position.getValid()); - preparedStatement.setDouble("altitude", position.getAltitude()); - preparedStatement.setDouble("latitude", position.getLatitude()); - preparedStatement.setDouble("longitude", position.getLongitude()); - preparedStatement.setDouble("speed", position.getSpeed()); - preparedStatement.setDouble("course", position.getCourse()); - preparedStatement.setString("address", position.getAddress()); - preparedStatement.setString("extended_info", position.getExtendedInfo()); - - // DELME: Temporary compatibility support - XPath xpath = XPathFactory.newInstance().newXPath(); - try { - InputSource source = new InputSource(new StringReader(position.getExtendedInfo())); - String index = xpath.evaluate("/info/index", source); - if (!index.isEmpty()) { - preparedStatement.setLong("id", Long.valueOf(index)); - } else { - preparedStatement.setLong("id", null); - } - source = new InputSource(new StringReader(position.getExtendedInfo())); - String power = xpath.evaluate("/info/power", source); - if (!power.isEmpty()) { - preparedStatement.setDouble("power", Double.valueOf(power)); - } else { - preparedStatement.setLong("power", null); - } - } catch (XPathExpressionException e) { - Log.warning("Error in XML: " + position.getExtendedInfo(), e); - preparedStatement.setLong("id", null); - preparedStatement.setLong("power", null); - } - - return preparedStatement; - - } - -} diff --git a/src/org/traccar/protocol/ApelProtocolDecoder.java b/src/org/traccar/protocol/ApelProtocolDecoder.java index 9ffc473c7..54b112b59 100644 --- a/src/org/traccar/protocol/ApelProtocolDecoder.java +++ b/src/org/traccar/protocol/ApelProtocolDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2013 - 2014 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. @@ -17,11 +17,9 @@ package org.traccar.protocol; import java.nio.ByteOrder; import java.nio.charset.Charset; -import java.sql.ResultSet; import java.util.Calendar; import java.util.LinkedList; import java.util.List; -import java.util.Properties; import java.util.TimeZone; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; @@ -29,10 +27,8 @@ import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.traccar.BaseProtocolDecoder; import org.traccar.ServerManager; -import org.traccar.helper.AdvancedConnection; import org.traccar.helper.Crc; import org.traccar.helper.Log; -import org.traccar.helper.NamedParameterStatement; import org.traccar.model.ExtendedInfoFormatter; import org.traccar.model.Position; @@ -77,7 +73,7 @@ public class ApelProtocolDecoder extends BaseProtocolDecoder { private static final String HEX_CHARS = "0123456789ABCDEF"; private void loadLastIndex() { - try { + /*try { Properties p = getServerManager().getProperties(); if (p.contains("database.selectLastIndex")) { AdvancedConnection connection = new AdvancedConnection( @@ -91,7 +87,7 @@ public class ApelProtocolDecoder extends BaseProtocolDecoder { } } } catch(Exception error) { - } + }*/ } private void sendSimpleMessage(Channel channel, short type) { diff --git a/src/org/traccar/protocol/ProgressProtocolDecoder.java b/src/org/traccar/protocol/ProgressProtocolDecoder.java index c4a4d5e6f..85680c039 100644 --- a/src/org/traccar/protocol/ProgressProtocolDecoder.java +++ b/src/org/traccar/protocol/ProgressProtocolDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 - 2013 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2012 - 2014 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. @@ -17,11 +17,9 @@ package org.traccar.protocol; import java.nio.ByteOrder; import java.nio.charset.Charset; -import java.sql.ResultSet; import java.util.Calendar; import java.util.LinkedList; import java.util.List; -import java.util.Properties; import java.util.TimeZone; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; @@ -29,9 +27,7 @@ import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.traccar.BaseProtocolDecoder; import org.traccar.ServerManager; -import org.traccar.helper.AdvancedConnection; import org.traccar.helper.Log; -import org.traccar.helper.NamedParameterStatement; import org.traccar.model.ExtendedInfoFormatter; import org.traccar.model.Position; @@ -63,11 +59,8 @@ public class ProgressProtocolDecoder extends BaseProtocolDecoder { private static final String HEX_CHARS = "0123456789ABCDEF"; - /** - * Hack to load last index from database - */ private void loadLastIndex() { - try { + /*try { Properties p = getServerManager().getProperties(); if (p.contains("database.selectLastIndex")) { AdvancedConnection connection = new AdvancedConnection( @@ -81,7 +74,7 @@ public class ProgressProtocolDecoder extends BaseProtocolDecoder { } } } catch(Exception error) { - } + }*/ } /** @@ -100,13 +93,8 @@ public class ProgressProtocolDecoder extends BaseProtocolDecoder { } } - /** - * Decode message - */ @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, Object msg) - throws Exception { + protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { ChannelBuffer buf = (ChannelBuffer) msg; int type = buf.readUnsignedShort(); diff --git a/test/org/traccar/helper/TestDataManager.java b/test/org/traccar/helper/TestDataManager.java index 9e8147b05..a54c1f7a3 100644 --- a/test/org/traccar/helper/TestDataManager.java +++ b/test/org/traccar/helper/TestDataManager.java @@ -1,16 +1,16 @@ package org.traccar.helper; import java.util.List; -import org.traccar.model.DataManager; +import org.traccar.database.DataManager; import org.traccar.model.Device; import org.traccar.model.Position; -public class TestDataManager implements DataManager { +public class TestDataManager extends DataManager { - @Override - public List getDevices() { - return null; + public TestDataManager() throws Exception { + super(null); } + @Override public Device getDeviceByImei(String imei) { Device device = new Device(); @@ -18,11 +18,5 @@ public class TestDataManager implements DataManager { device.setImei("123456789012345"); return device; } - @Override - public Long addPosition(Position position) { - return null; - } - @Override - public void updateLatestPosition(Position position, Long positionId) throws Exception { - } + } -- cgit v1.2.3