aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/traccar/database
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2022-02-13 23:34:25 -0800
committerAnton Tananaev <anton.tananaev@gmail.com>2022-02-13 23:34:25 -0800
commit1c73bae2e23242673e0a07cdbc2493700f134ceb (patch)
treed1105368628b5f64fabb657682df58f1641e4d54 /src/main/java/org/traccar/database
parentde110b28ce8adb6ba875d88ede6e8f86dae4dd48 (diff)
downloadtrackermap-server-1c73bae2e23242673e0a07cdbc2493700f134ceb.tar.gz
trackermap-server-1c73bae2e23242673e0a07cdbc2493700f134ceb.tar.bz2
trackermap-server-1c73bae2e23242673e0a07cdbc2493700f134ceb.zip
New storage implementation
Diffstat (limited to 'src/main/java/org/traccar/database')
-rw-r--r--src/main/java/org/traccar/database/BaseObjectManager.java10
-rw-r--r--src/main/java/org/traccar/database/ConnectionManager.java6
-rw-r--r--src/main/java/org/traccar/database/DataManager.java265
-rw-r--r--src/main/java/org/traccar/database/DeviceManager.java28
-rw-r--r--src/main/java/org/traccar/database/ExtendedObjectManager.java6
-rw-r--r--src/main/java/org/traccar/database/GroupsManager.java4
-rw-r--r--src/main/java/org/traccar/database/NotificationManager.java4
-rw-r--r--src/main/java/org/traccar/database/PermissionsManager.java10
-rw-r--r--src/main/java/org/traccar/database/SimpleObjectManager.java6
-rw-r--r--src/main/java/org/traccar/database/StatisticsManager.java4
-rw-r--r--src/main/java/org/traccar/database/UsersManager.java9
11 files changed, 145 insertions, 207 deletions
diff --git a/src/main/java/org/traccar/database/BaseObjectManager.java b/src/main/java/org/traccar/database/BaseObjectManager.java
index be6310033..dd8b3bae4 100644
--- a/src/main/java/org/traccar/database/BaseObjectManager.java
+++ b/src/main/java/org/traccar/database/BaseObjectManager.java
@@ -16,7 +16,6 @@
*/
package org.traccar.database;
-import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
@@ -29,6 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.traccar.model.BaseModel;
+import org.traccar.storage.StorageException;
public class BaseObjectManager<T extends BaseModel> {
@@ -102,7 +102,7 @@ public class BaseObjectManager<T extends BaseModel> {
removeCachedItem(cachedItemId);
}
}
- } catch (SQLException error) {
+ } catch (StorageException error) {
LOGGER.warn("Error refreshing items", error);
} finally {
writeUnlock();
@@ -119,7 +119,7 @@ public class BaseObjectManager<T extends BaseModel> {
}
}
- public void addItem(T item) throws SQLException {
+ public void addItem(T item) throws StorageException {
dataManager.addObject(item);
addNewItem(item);
}
@@ -133,7 +133,7 @@ public class BaseObjectManager<T extends BaseModel> {
}
}
- public void updateItem(T item) throws SQLException {
+ public void updateItem(T item) throws StorageException {
dataManager.updateObject(item);
updateCachedItem(item);
}
@@ -147,7 +147,7 @@ public class BaseObjectManager<T extends BaseModel> {
}
}
- public void removeItem(long itemId) throws SQLException {
+ public void removeItem(long itemId) throws StorageException {
BaseModel item = getById(itemId);
if (item != null) {
dataManager.removeObject(baseClass, itemId);
diff --git a/src/main/java/org/traccar/database/ConnectionManager.java b/src/main/java/org/traccar/database/ConnectionManager.java
index e12d44612..359061f00 100644
--- a/src/main/java/org/traccar/database/ConnectionManager.java
+++ b/src/main/java/org/traccar/database/ConnectionManager.java
@@ -30,9 +30,9 @@ import org.traccar.model.Device;
import org.traccar.model.DeviceState;
import org.traccar.model.Event;
import org.traccar.model.Position;
+import org.traccar.storage.StorageException;
import java.net.SocketAddress;
-import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -127,8 +127,8 @@ public class ConnectionManager {
try {
Context.getDeviceManager().updateDeviceStatus(device);
- } catch (SQLException error) {
- LOGGER.warn("Update device status error", error);
+ } catch (StorageException e) {
+ LOGGER.warn("Update device status error", e);
}
updateDevice(device);
diff --git a/src/main/java/org/traccar/database/DataManager.java b/src/main/java/org/traccar/database/DataManager.java
index 199167419..303b8e033 100644
--- a/src/main/java/org/traccar/database/DataManager.java
+++ b/src/main/java/org/traccar/database/DataManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 - 2021 Anton Tananaev (anton@traccar.org)
+ * Copyright 2012 - 2022 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -41,15 +41,20 @@ import org.traccar.model.Group;
import org.traccar.model.Maintenance;
import org.traccar.model.ManagedUser;
import org.traccar.model.Notification;
-import org.traccar.model.Order;
import org.traccar.model.Permission;
import org.traccar.model.Position;
import org.traccar.model.Server;
import org.traccar.model.Statistics;
import org.traccar.model.User;
+import org.traccar.storage.DatabaseStorage;
import org.traccar.storage.QueryBuilder;
-import org.traccar.storage.QueryExtended;
-import org.traccar.storage.QueryIgnore;
+import org.traccar.storage.Storage;
+import org.traccar.storage.StorageException;
+import org.traccar.storage.query.Columns;
+import org.traccar.storage.query.Condition;
+import org.traccar.storage.query.Limit;
+import org.traccar.storage.query.Order;
+import org.traccar.storage.query.Request;
import javax.sql.DataSource;
import java.beans.Introspector;
@@ -57,11 +62,10 @@ import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.sql.SQLException;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.LinkedList;
+import java.util.List;
public class DataManager {
@@ -81,6 +85,8 @@ public class DataManager {
return dataSource;
}
+ private final Storage storage;
+
private boolean generateQueries;
private final boolean forceLdap;
@@ -92,6 +98,8 @@ public class DataManager {
initDatabase();
initDatabaseSchema();
+
+ storage = new DatabaseStorage(dataSource);
}
private void initDatabase() throws Exception {
@@ -134,58 +142,6 @@ public class DataManager {
dataSource = new HikariDataSource(hikariConfig);
}
- public static String constructObjectQuery(String action, Class<?> clazz, boolean extended) {
- switch (action) {
- case ACTION_INSERT:
- case ACTION_UPDATE:
- StringBuilder result = new StringBuilder();
- StringBuilder fields = new StringBuilder();
- StringBuilder values = new StringBuilder();
-
- Set<Method> methods = new HashSet<>(Arrays.asList(clazz.getMethods()));
- methods.removeAll(Arrays.asList(Object.class.getMethods()));
- methods.removeAll(Arrays.asList(BaseModel.class.getMethods()));
- for (Method method : methods) {
- boolean skip;
- if (extended) {
- skip = !method.isAnnotationPresent(QueryExtended.class);
- } else {
- skip = method.isAnnotationPresent(QueryIgnore.class)
- || method.isAnnotationPresent(QueryExtended.class) && !action.equals(ACTION_INSERT);
- }
- if (!skip && method.getName().startsWith("get") && method.getParameterTypes().length == 0) {
- String name = Introspector.decapitalize(method.getName().substring(3));
- if (action.equals(ACTION_INSERT)) {
- fields.append(name).append(", ");
- values.append(":").append(name).append(", ");
- } else {
- fields.append(name).append(" = :").append(name).append(", ");
- }
- }
- }
- fields.setLength(fields.length() - 2);
- if (action.equals(ACTION_INSERT)) {
- values.setLength(values.length() - 2);
- result.append("INSERT INTO ").append(getObjectsTableName(clazz)).append(" (");
- result.append(fields).append(") ");
- result.append("VALUES (").append(values).append(")");
- } else {
- result.append("UPDATE ").append(getObjectsTableName(clazz)).append(" SET ");
- result.append(fields);
- result.append(" WHERE id = :id");
- }
- return result.toString();
- case ACTION_SELECT_ALL:
- return "SELECT * FROM " + getObjectsTableName(clazz);
- case ACTION_SELECT:
- return "SELECT * FROM " + getObjectsTableName(clazz) + " WHERE id = :id";
- case ACTION_DELETE:
- return "DELETE FROM " + getObjectsTableName(clazz) + " WHERE id = :id";
- default:
- throw new IllegalArgumentException("Unknown action");
- }
- }
-
public static String constructPermissionQuery(String action, Class<?> owner, Class<?> property) {
switch (action) {
case ACTION_SELECT_ALL:
@@ -204,39 +160,6 @@ public class DataManager {
}
}
- private String getQuery(String key) {
- String query = config.getString(key);
- if (query == null) {
- LOGGER.info("Query not provided: " + key);
- }
- return query;
- }
-
- public String getQuery(String action, Class<?> clazz) {
- return getQuery(action, clazz, false);
- }
-
- public String getQuery(String action, Class<?> clazz, boolean extended) {
- String queryName;
- if (action.equals(ACTION_SELECT_ALL)) {
- queryName = "database.select" + clazz.getSimpleName() + "s";
- } else {
- queryName = "database." + action.toLowerCase() + clazz.getSimpleName();
- if (extended) {
- queryName += "Extended";
- }
- }
- String query = config.getString(queryName);
- if (query == null) {
- if (generateQueries) {
- query = constructObjectQuery(action, clazz, extended);
- } else {
- LOGGER.info("Query not provided: " + queryName);
- }
- }
- return query;
- }
-
public String getQuery(String action, Class<?> owner, Class<?> property) {
String queryName;
switch (action) {
@@ -302,10 +225,12 @@ public class DataManager {
}
}
- public User login(String email, String password) throws SQLException {
- User user = QueryBuilder.create(dataSource, getQuery("database.loginUser"))
- .setString("email", email.trim())
- .executeQuerySingle(User.class);
+ public User login(String email, String password) throws StorageException {
+ User user = storage.getObject(User.class, new Request(
+ new Columns.Include("id", "login", "hashedPassword", "salt"),
+ new Condition.Or(
+ new Condition.Equals("email", "email", email.trim()),
+ new Condition.Equals("login", "email"))));
LdapProvider ldapProvider = Context.getLdapProvider();
if (user != null) {
if (ldapProvider != null && user.getLogin() != null && ldapProvider.login(user.getLogin(), password)
@@ -322,57 +247,75 @@ public class DataManager {
return null;
}
- public void updateDeviceStatus(Device device) throws SQLException {
- QueryBuilder.create(dataSource, getQuery(ACTION_UPDATE, Device.class, true))
- .setObject(device)
- .executeUpdate();
+ public void updateUserPassword(User user) throws StorageException {
+ storage.updateObject(user, new Request(
+ new Columns.Include("hashedPassword", "salt"),
+ new Condition.Equals("id", "id")));
}
- public Collection<Position> getPositions(long deviceId, Date from, Date to) throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectPositions"))
- .setLong("deviceId", deviceId)
- .setDate("from", from)
- .setDate("to", to)
- .executeQuery(Position.class);
+ public void updateDeviceStatus(Device device) throws StorageException {
+ storage.updateObject(device, new Request(
+ new Columns.Include("lastUpdate"),
+ new Condition.Equals("id", "id")));
}
- public Position getPrecedingPosition(long deviceId, Date date) throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectPrecedingPosition"))
- .setLong("deviceId", deviceId)
- .setDate("time", date)
- .executeQuerySingle(Position.class);
+ public Collection<Position> getPositions(long deviceId, Date from, Date to) throws StorageException {
+ return storage.getObjects(Position.class, new Request(
+ new Columns.All(),
+ new Condition.And(
+ new Condition.Equals("deviceId", "deviceId", deviceId),
+ new Condition.Between("fixTime", "from", from, "to", to)),
+ new Order("fixTime")));
}
- public void updateLatestPosition(Position position) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.updateLatestPosition"))
- .setDate("now", new Date())
- .setObject(position)
- .executeUpdate();
+ public Position getPrecedingPosition(long deviceId, Date date) throws StorageException {
+ return storage.getObject(Position.class, new Request(
+ new Columns.All(),
+ new Condition.And(
+ new Condition.Equals("deviceId", "deviceId", deviceId),
+ new Condition.Compare("fixTime", "<=", "time", date)),
+ new Order(true, "fixTime"),
+ new Limit(1)));
}
- public Collection<Position> getLatestPositions() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectLatestPositions"))
- .executeQuery(Position.class);
+ public void updateLatestPosition(Position position) throws StorageException {
+ Device device = new Device();
+ device.setId(position.getDeviceId());
+ device.setPositionId(position.getId());
+ storage.updateObject(device, new Request(
+ new Columns.Include("positionId"),
+ new Condition.Equals("id", "id")));
+ }
+
+ public Collection<Position> getLatestPositions() throws StorageException {
+ List<Position> positions = new LinkedList<>();
+ List<Device> devices = storage.getObjects(Device.class, new Request(new Columns.Include("positionId")));
+ for (Device device : devices) {
+ positions.addAll(storage.getObjects(Position.class, new Request(
+ new Columns.All(),
+ new Condition.Equals("id", "id", device.getPositionId()))));
+ }
+ return positions;
}
- public Server getServer() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery(ACTION_SELECT_ALL, Server.class))
- .executeQuerySingle(Server.class);
+ public Server getServer() throws StorageException {
+ return storage.getObject(Server.class, new Request(new Columns.All()));
}
- public Collection<Event> getEvents(long deviceId, Date from, Date to) throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectEvents"))
- .setLong("deviceId", deviceId)
- .setDate("from", from)
- .setDate("to", to)
- .executeQuery(Event.class);
+ public Collection<Event> getEvents(long deviceId, Date from, Date to) throws StorageException {
+ return storage.getObjects(Event.class, new Request(
+ new Columns.All(),
+ new Condition.And(
+ new Condition.Equals("deviceId", "deviceId", deviceId),
+ new Condition.Between("eventTime", "from", from, "to", to)),
+ new Order("eventTime")));
}
- public Collection<Statistics> getStatistics(Date from, Date to) throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectStatistics"))
- .setDate("from", from)
- .setDate("to", to)
- .executeQuery(Statistics.class);
+ public Collection<Statistics> getStatistics(Date from, Date to) throws StorageException {
+ return storage.getObjects(Statistics.class, new Request(
+ new Columns.All(),
+ new Condition.Between("captureTime", "from", from, "to", to),
+ new Order("captureTime")));
}
public static Class<?> getClassByName(String name) throws ClassNotFoundException {
@@ -400,7 +343,7 @@ public class DataManager {
case "notification":
return Notification.class;
case "order":
- return Order.class;
+ return org.traccar.model.Order.class;
default:
throw new ClassNotFoundException();
}
@@ -412,51 +355,49 @@ public class DataManager {
}
public Collection<Permission> getPermissions(Class<? extends BaseModel> owner, Class<? extends BaseModel> property)
- throws SQLException, ClassNotFoundException {
- return QueryBuilder.create(dataSource, getQuery(ACTION_SELECT_ALL, owner, property))
- .executePermissionsQuery();
+ throws StorageException, ClassNotFoundException {
+ try {
+ return QueryBuilder.create(dataSource, getQuery(ACTION_SELECT_ALL, owner, property))
+ .executePermissionsQuery();
+ } catch (SQLException e) {
+ throw new StorageException(e);
+ }
}
public void linkObject(Class<?> owner, long ownerId, Class<?> property, long propertyId, boolean link)
- throws SQLException {
+ throws StorageException {
+ try {
QueryBuilder.create(dataSource, getQuery(link ? ACTION_INSERT : ACTION_DELETE, owner, property))
.setLong(makeNameId(owner), ownerId)
.setLong(makeNameId(property), propertyId)
.executeUpdate();
+ } catch (SQLException e) {
+ throw new StorageException(e);
+ }
}
- public <T extends BaseModel> T getObject(Class<T> clazz, long entityId) throws SQLException {
- return QueryBuilder.create(dataSource, getQuery(ACTION_SELECT, clazz))
- .setLong("id", entityId)
- .executeQuerySingle(clazz);
+ public <T extends BaseModel> T getObject(Class<T> clazz, long entityId) throws StorageException {
+ return storage.getObject(clazz, new Request(
+ new Columns.All(),
+ new Condition.Equals("id", "id", entityId)));
}
- public <T extends BaseModel> Collection<T> getObjects(Class<T> clazz) throws SQLException {
- return QueryBuilder.create(dataSource, getQuery(ACTION_SELECT_ALL, clazz))
- .executeQuery(clazz);
+ public <T extends BaseModel> Collection<T> getObjects(Class<T> clazz) throws StorageException {
+ return storage.getObjects(clazz, new Request(new Columns.All()));
}
- public void addObject(BaseModel entity) throws SQLException {
- entity.setId(QueryBuilder.create(dataSource, getQuery(ACTION_INSERT, entity.getClass()), true)
- .setObject(entity)
- .executeUpdate());
+ public void addObject(BaseModel entity) throws StorageException {
+ entity.setId(storage.addObject(entity, new Request(new Columns.Exclude("id"))));
}
- public void updateObject(BaseModel entity) throws SQLException {
- QueryBuilder.create(dataSource, getQuery(ACTION_UPDATE, entity.getClass()))
- .setObject(entity)
- .executeUpdate();
- if (entity instanceof User && ((User) entity).getHashedPassword() != null) {
- QueryBuilder.create(dataSource, getQuery(ACTION_UPDATE, User.class, true))
- .setObject(entity)
- .executeUpdate();
- }
+ public void updateObject(BaseModel entity) throws StorageException {
+ storage.updateObject(entity, new Request(
+ new Columns.Exclude("id"),
+ new Condition.Equals("id", "id")));
}
- public void removeObject(Class<? extends BaseModel> clazz, long entityId) throws SQLException {
- QueryBuilder.create(dataSource, getQuery(ACTION_DELETE, clazz))
- .setLong("id", entityId)
- .executeUpdate();
+ public void removeObject(Class<? extends BaseModel> clazz, long entityId) throws StorageException {
+ storage.removeObject(clazz, new Request(new Condition.Equals("id", "id", entityId)));
}
}
diff --git a/src/main/java/org/traccar/database/DeviceManager.java b/src/main/java/org/traccar/database/DeviceManager.java
index c8a99274c..40591e869 100644
--- a/src/main/java/org/traccar/database/DeviceManager.java
+++ b/src/main/java/org/traccar/database/DeviceManager.java
@@ -37,6 +37,7 @@ import org.traccar.model.DeviceAccumulators;
import org.traccar.model.Group;
import org.traccar.model.Position;
import org.traccar.model.Server;
+import org.traccar.storage.StorageException;
public class DeviceManager extends BaseObjectManager<Device> implements IdentityManager, ManagableObjects {
@@ -94,13 +95,13 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity
}
return device.getId();
- } catch (SQLException e) {
+ } catch (StorageException e) {
LOGGER.warn("Automatic device registration error", e);
return 0;
}
}
- public void updateDeviceCache(boolean force) throws SQLException {
+ public void updateDeviceCache(boolean force) {
long lastUpdate = devicesLastUpdate.get();
if ((force || System.currentTimeMillis() - lastUpdate > dataRefreshDelay)
&& devicesLastUpdate.compareAndSet(lastUpdate, System.currentTimeMillis())) {
@@ -144,24 +145,11 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity
return defaultPassword;
}
- public Device getDeviceByPhone(String phone) {
- try {
- readLock();
- return devicesByPhone.get(phone);
- } finally {
- readUnlock();
- }
- }
-
@Override
public Set<Long> getAllItems() {
Set<Long> result = super.getAllItems();
if (result.isEmpty()) {
- try {
- updateDeviceCache(true);
- } catch (SQLException e) {
- LOGGER.warn("Update device cache error", e);
- }
+ updateDeviceCache(true);
result = super.getAllItems();
}
return result;
@@ -309,7 +297,7 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity
positions.remove(deviceId);
}
- public void updateDeviceStatus(Device device) throws SQLException {
+ public void updateDeviceStatus(Device device) throws StorageException {
getDataManager().updateDeviceStatus(device);
Device cachedDevice = getById(device.getId());
if (cachedDevice != null) {
@@ -323,7 +311,7 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity
for (Position position : getDataManager().getLatestPositions()) {
positions.put(position.getDeviceId(), position);
}
- } catch (SQLException error) {
+ } catch (StorageException error) {
LOGGER.warn("Load latest positions error", error);
}
}
@@ -334,7 +322,7 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity
return lastPosition == null || position.getFixTime().compareTo(lastPosition.getFixTime()) >= 0;
}
- public void updateLatestPosition(Position position) throws SQLException {
+ public void updateLatestPosition(Position position) throws StorageException {
if (isLatestPosition(position)) {
@@ -451,7 +439,7 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity
return result;
}
- public void resetDeviceAccumulators(DeviceAccumulators deviceAccumulators) throws SQLException {
+ public void resetDeviceAccumulators(DeviceAccumulators deviceAccumulators) throws StorageException {
Position last = positions.get(deviceAccumulators.getDeviceId());
if (last != null) {
if (deviceAccumulators.getTotalDistance() != null) {
diff --git a/src/main/java/org/traccar/database/ExtendedObjectManager.java b/src/main/java/org/traccar/database/ExtendedObjectManager.java
index 93e5820fb..006ed47b2 100644
--- a/src/main/java/org/traccar/database/ExtendedObjectManager.java
+++ b/src/main/java/org/traccar/database/ExtendedObjectManager.java
@@ -16,7 +16,6 @@
*/
package org.traccar.database;
-import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
@@ -30,6 +29,7 @@ import org.traccar.model.Device;
import org.traccar.model.Group;
import org.traccar.model.Permission;
import org.traccar.model.BaseModel;
+import org.traccar.storage.StorageException;
public abstract class ExtendedObjectManager<T extends BaseModel> extends SimpleObjectManager<T> {
@@ -87,7 +87,7 @@ public abstract class ExtendedObjectManager<T extends BaseModel> extends SimpleO
}
@Override
- public void removeItem(long itemId) throws SQLException {
+ public void removeItem(long itemId) throws StorageException {
super.removeItem(itemId);
refreshExtendedPermissions();
}
@@ -133,7 +133,7 @@ public abstract class ExtendedObjectManager<T extends BaseModel> extends SimpleO
}
}
- } catch (SQLException | ClassNotFoundException error) {
+ } catch (StorageException | ClassNotFoundException error) {
LOGGER.warn("Refresh permissions error", error);
} finally {
writeUnlock();
diff --git a/src/main/java/org/traccar/database/GroupsManager.java b/src/main/java/org/traccar/database/GroupsManager.java
index c35f35f93..dafddc0cc 100644
--- a/src/main/java/org/traccar/database/GroupsManager.java
+++ b/src/main/java/org/traccar/database/GroupsManager.java
@@ -16,12 +16,12 @@
*/
package org.traccar.database;
-import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;
import org.traccar.Context;
import org.traccar.model.Group;
+import org.traccar.storage.StorageException;
public class GroupsManager extends BaseObjectManager<Group> implements ManagableObjects {
@@ -57,7 +57,7 @@ public class GroupsManager extends BaseObjectManager<Group> implements Managable
}
@Override
- public void updateItem(Group group) throws SQLException {
+ public void updateItem(Group group) throws StorageException {
checkGroupCycles(group);
super.updateItem(group);
}
diff --git a/src/main/java/org/traccar/database/NotificationManager.java b/src/main/java/org/traccar/database/NotificationManager.java
index 9f9a83cd2..f358b1d4d 100644
--- a/src/main/java/org/traccar/database/NotificationManager.java
+++ b/src/main/java/org/traccar/database/NotificationManager.java
@@ -18,7 +18,6 @@ package org.traccar.database;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
-import java.sql.SQLException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
@@ -36,6 +35,7 @@ import org.traccar.model.Event;
import org.traccar.model.Notification;
import org.traccar.model.Position;
import org.traccar.model.Typed;
+import org.traccar.storage.StorageException;
public class NotificationManager extends ExtendedObjectManager<Notification> {
@@ -66,7 +66,7 @@ public class NotificationManager extends ExtendedObjectManager<Notification> {
public void updateEvent(Event event, Position position) {
try {
getDataManager().addObject(event);
- } catch (SQLException error) {
+ } catch (StorageException error) {
LOGGER.warn("Event save error", error);
}
diff --git a/src/main/java/org/traccar/database/PermissionsManager.java b/src/main/java/org/traccar/database/PermissionsManager.java
index ab841a521..2bb808033 100644
--- a/src/main/java/org/traccar/database/PermissionsManager.java
+++ b/src/main/java/org/traccar/database/PermissionsManager.java
@@ -33,8 +33,8 @@ import org.traccar.model.Order;
import org.traccar.model.Permission;
import org.traccar.model.Server;
import org.traccar.model.User;
+import org.traccar.storage.StorageException;
-import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -156,7 +156,7 @@ public class PermissionsManager {
public void refreshServer() {
try {
server = dataManager.getServer();
- } catch (SQLException error) {
+ } catch (StorageException error) {
LOGGER.warn("Refresh server config error", error);
}
}
@@ -193,7 +193,7 @@ public class PermissionsManager {
}
}
- } catch (SQLException | ClassNotFoundException error) {
+ } catch (StorageException | ClassNotFoundException error) {
LOGGER.warn("Refresh device permissions error", error);
}
@@ -499,12 +499,12 @@ public class PermissionsManager {
return server;
}
- public void updateServer(Server server) throws SQLException {
+ public void updateServer(Server server) throws StorageException {
dataManager.updateObject(server);
this.server = server;
}
- public User login(String email, String password) throws SQLException {
+ public User login(String email, String password) throws StorageException {
User user = dataManager.login(email, password);
if (user != null) {
checkUserEnabled(user.getId());
diff --git a/src/main/java/org/traccar/database/SimpleObjectManager.java b/src/main/java/org/traccar/database/SimpleObjectManager.java
index eb8284d4e..78701720f 100644
--- a/src/main/java/org/traccar/database/SimpleObjectManager.java
+++ b/src/main/java/org/traccar/database/SimpleObjectManager.java
@@ -16,7 +16,6 @@
*/
package org.traccar.database;
-import java.sql.SQLException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -28,6 +27,7 @@ import org.traccar.Context;
import org.traccar.model.BaseModel;
import org.traccar.model.Permission;
import org.traccar.model.User;
+import org.traccar.storage.StorageException;
public abstract class SimpleObjectManager<T extends BaseModel> extends BaseObjectManager<T>
implements ManagableObjects {
@@ -83,7 +83,7 @@ public abstract class SimpleObjectManager<T extends BaseModel> extends BaseObjec
Set<Long> items = userItems.computeIfAbsent(permission.getOwnerId(), key -> new HashSet<>());
items.add(permission.getPropertyId());
}
- } catch (SQLException | ClassNotFoundException error) {
+ } catch (StorageException | ClassNotFoundException error) {
LOGGER.warn("Error getting permissions", error);
} finally {
writeUnlock();
@@ -92,7 +92,7 @@ public abstract class SimpleObjectManager<T extends BaseModel> extends BaseObjec
}
@Override
- public void removeItem(long itemId) throws SQLException {
+ public void removeItem(long itemId) throws StorageException {
super.removeItem(itemId);
refreshUserItems();
}
diff --git a/src/main/java/org/traccar/database/StatisticsManager.java b/src/main/java/org/traccar/database/StatisticsManager.java
index 4ad6d9d5c..3579ce7a5 100644
--- a/src/main/java/org/traccar/database/StatisticsManager.java
+++ b/src/main/java/org/traccar/database/StatisticsManager.java
@@ -23,12 +23,12 @@ import org.traccar.config.Config;
import org.traccar.config.Keys;
import org.traccar.helper.DateUtil;
import org.traccar.model.Statistics;
+import org.traccar.storage.StorageException;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Form;
-import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
@@ -106,7 +106,7 @@ public class StatisticsManager {
try {
dataManager.addObject(statistics);
- } catch (SQLException e) {
+ } catch (StorageException e) {
LOGGER.warn("Error saving statistics", e);
}
diff --git a/src/main/java/org/traccar/database/UsersManager.java b/src/main/java/org/traccar/database/UsersManager.java
index b741a85b6..31759dc8b 100644
--- a/src/main/java/org/traccar/database/UsersManager.java
+++ b/src/main/java/org/traccar/database/UsersManager.java
@@ -21,6 +21,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.traccar.model.User;
+import org.traccar.storage.StorageException;
public class UsersManager extends SimpleObjectManager<User> {
@@ -59,6 +60,14 @@ public class UsersManager extends SimpleObjectManager<User> {
}
@Override
+ public void updateItem(User user) throws StorageException {
+ if (user.getHashedPassword() != null) {
+ getDataManager().updateUserPassword(user);
+ }
+ super.updateItem(user);
+ }
+
+ @Override
protected void removeCachedItem(long userId) {
User cachedUser = getById(userId);
if (cachedUser != null) {