aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/database
diff options
context:
space:
mode:
authorAbyss777 <abyss@fox5.ru>2017-07-19 15:24:55 +0500
committerAbyss777 <abyss@fox5.ru>2017-07-19 15:24:55 +0500
commita9478ded48de140d47d17def1ee5329267fe6088 (patch)
treeadc5a9177fd5adcf10a8b56ee4620780dfc13cd9 /src/org/traccar/database
parentcb0d7cccaecfe049e04defd90884976ac1e982f9 (diff)
downloadtrackermap-server-a9478ded48de140d47d17def1ee5329267fe6088.tar.gz
trackermap-server-a9478ded48de140d47d17def1ee5329267fe6088.tar.bz2
trackermap-server-a9478ded48de140d47d17def1ee5329267fe6088.zip
Refactored four managers
Diffstat (limited to 'src/org/traccar/database')
-rw-r--r--src/org/traccar/database/AttributesManager.java171
-rw-r--r--src/org/traccar/database/CalendarManager.java99
-rw-r--r--src/org/traccar/database/DataManager.java183
-rw-r--r--src/org/traccar/database/DriversManager.java179
-rw-r--r--src/org/traccar/database/ExtendedObjectManager.java129
-rw-r--r--src/org/traccar/database/GeofenceManager.java284
-rw-r--r--src/org/traccar/database/NotificationManager.java2
-rw-r--r--src/org/traccar/database/PermissionsManager.java73
-rw-r--r--src/org/traccar/database/SimpleObjectManager.java164
9 files changed, 416 insertions, 868 deletions
diff --git a/src/org/traccar/database/AttributesManager.java b/src/org/traccar/database/AttributesManager.java
index 362d6130f..88bedfba4 100644
--- a/src/org/traccar/database/AttributesManager.java
+++ b/src/org/traccar/database/AttributesManager.java
@@ -17,183 +17,30 @@
package org.traccar.database;
import java.sql.SQLException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import org.traccar.Context;
-import org.traccar.helper.Log;
import org.traccar.model.AttributePermission;
import org.traccar.model.Attribute;
-import org.traccar.model.Device;
import org.traccar.model.DeviceAttribute;
import org.traccar.model.GroupAttribute;
+import org.traccar.model.Identifiable;
-public class AttributesManager {
-
- private final DataManager dataManager;
-
- private final Map<Long, Attribute> attributes = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> deviceAttributes = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> deviceAttributesWithGroups = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> groupAttributes = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> userAttributes = new ConcurrentHashMap<>();
+public class AttributesManager extends ExtendedObjectManager {
public AttributesManager(DataManager dataManager) {
- this.dataManager = dataManager;
- refreshAttributes();
- }
-
- public Set<Long> getUserAttributes(long userId) {
- if (!userAttributes.containsKey(userId)) {
- userAttributes.put(userId, new HashSet<Long>());
- }
- return userAttributes.get(userId);
- }
-
- public Set<Long> getGroupAttributes(long groupId) {
- if (!groupAttributes.containsKey(groupId)) {
- groupAttributes.put(groupId, new HashSet<Long>());
- }
- return groupAttributes.get(groupId);
- }
-
- public Set<Long> getDeviceAttributes(long deviceId) {
- return getDeviceAttributes(deviceAttributes, deviceId);
- }
-
- public Set<Long> getAllDeviceAttributes(long deviceId) {
- return getDeviceAttributes(deviceAttributesWithGroups, deviceId);
- }
-
- private Set<Long> getDeviceAttributes(Map<Long, Set<Long>> deviceAttributes, long deviceId) {
- if (!deviceAttributes.containsKey(deviceId)) {
- deviceAttributes.put(deviceId, new HashSet<Long>());
- }
- return deviceAttributes.get(deviceId);
- }
-
- public final void refreshAttributes() {
- if (dataManager != null) {
- try {
- attributes.clear();
- for (Attribute attribute : dataManager.getAttributes()) {
- attributes.put(attribute.getId(), attribute);
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- refreshUserAttributes();
+ super(dataManager, Attribute.class, AttributePermission.class, DeviceAttribute.class, GroupAttribute.class);
+ refreshItems();
refresh();
}
- public final void refreshUserAttributes() {
- if (dataManager != null) {
- try {
- userAttributes.clear();
- for (AttributePermission attributePermission : dataManager.getAttributePermissions()) {
- getUserAttributes(attributePermission.getUserId()).add(attributePermission.getAttributeId());
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- }
-
- public final void refresh() {
- if (dataManager != null) {
- try {
-
- Collection<GroupAttribute> databaseGroupAttributes = dataManager.getGroupAttributes();
-
- groupAttributes.clear();
- for (GroupAttribute groupAttribute : databaseGroupAttributes) {
- getGroupAttributes(groupAttribute.getGroupId()).add(groupAttribute.getAttributeId());
- }
-
- Collection<DeviceAttribute> databaseDeviceAttributes = dataManager.getDeviceAttributes();
- Collection<Device> allDevices = Context.getDeviceManager().getAllDevices();
-
- deviceAttributes.clear();
- deviceAttributesWithGroups.clear();
-
- for (DeviceAttribute deviceAttribute : databaseDeviceAttributes) {
- getDeviceAttributes(deviceAttribute.getDeviceId())
- .add(deviceAttribute.getAttributeId());
- getAllDeviceAttributes(deviceAttribute.getDeviceId())
- .add(deviceAttribute.getAttributeId());
- }
-
- for (Device device : allDevices) {
- long groupId = device.getGroupId();
- while (groupId != 0) {
- getAllDeviceAttributes(device.getId()).addAll(getGroupAttributes(groupId));
- if (Context.getDeviceManager().getGroupById(groupId) != null) {
- groupId = Context.getDeviceManager().getGroupById(groupId).getGroupId();
- } else {
- groupId = 0;
- }
- }
- }
-
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- }
-
- public void addAttribute(Attribute attribute) throws SQLException {
- dataManager.addAttribute(attribute);
- attributes.put(attribute.getId(), attribute);
- }
-
- public void updateAttribute(Attribute attribute) throws SQLException {
- dataManager.updateAttribute(attribute);
- Attribute cachedAttribute = attributes.get(attribute.getId());
+ @Override
+ public void updateItem(Identifiable item) throws SQLException {
+ Attribute attribute = (Attribute) item;
+ getDataManager().updateObject(attribute);
+ Attribute cachedAttribute = (Attribute) getById(item.getId());
cachedAttribute.setDescription(attribute.getDescription());
cachedAttribute.setAttribute(attribute.getAttribute());
cachedAttribute.setExpression(attribute.getExpression());
cachedAttribute.setType(attribute.getType());
}
- public void removeAttribute(long computedAttributeId) throws SQLException {
- dataManager.removeAttribute(computedAttributeId);
- attributes.remove(computedAttributeId);
- refreshUserAttributes();
- refresh();
- }
-
- public boolean checkAttribute(long userId, long attributeId) {
- return getUserAttributes(userId).contains(attributeId);
- }
-
- public Attribute getAttribute(long id) {
- return attributes.get(id);
- }
-
- public final Collection<Attribute> getAttributes(Set<Long> attributeIds) {
- Collection<Attribute> result = new LinkedList<>();
- for (long attributeId : attributeIds) {
- result.add(getAttribute(attributeId));
- }
- return result;
- }
-
- public final Set<Long> getAllAttributes() {
- return attributes.keySet();
- }
-
- public final Set<Long> getManagedAttributes(long userId) {
- Set<Long> attributes = new HashSet<>();
- attributes.addAll(getUserAttributes(userId));
- for (long managedUserId : Context.getPermissionsManager().getUserPermissions(userId)) {
- attributes.addAll(getUserAttributes(managedUserId));
- }
- return attributes;
- }
-
}
diff --git a/src/org/traccar/database/CalendarManager.java b/src/org/traccar/database/CalendarManager.java
index 31d484327..e00b4faa6 100644
--- a/src/org/traccar/database/CalendarManager.java
+++ b/src/org/traccar/database/CalendarManager.java
@@ -16,107 +16,14 @@
*/
package org.traccar.database;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.traccar.Context;
-import org.traccar.helper.Log;
import org.traccar.model.Calendar;
import org.traccar.model.CalendarPermission;
-public class CalendarManager {
-
- private final DataManager dataManager;
-
- private final Map<Long, Calendar> calendars = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> userCalendars = new ConcurrentHashMap<>();
+public class CalendarManager extends SimpleObjectManager {
public CalendarManager(DataManager dataManager) {
- this.dataManager = dataManager;
- refreshCalendars();
- }
-
- public final void refreshCalendars() {
- if (dataManager != null) {
- try {
- calendars.clear();
- for (Calendar calendar : dataManager.getCalendars()) {
- calendars.put(calendar.getId(), calendar);
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- refreshUserCalendars();
- }
-
- private Set<Long> getUserCalendarIds(long userId) {
- if (!userCalendars.containsKey(userId)) {
- userCalendars.put(userId, new HashSet<Long>());
- }
- return userCalendars.get(userId);
- }
-
- public Collection<Calendar> getUserCalendars(long userId) {
- ArrayList<Calendar> result = new ArrayList<>();
- for (long calendarId : getUserCalendarIds(userId)) {
- result.add(calendars.get(calendarId));
- }
- return result;
- }
-
- public Collection<Calendar> getManagedCalendars(long userId) {
- ArrayList<Calendar> result = new ArrayList<>();
- result.addAll(getUserCalendars(userId));
- for (long managedUserId : Context.getPermissionsManager().getUserPermissions(userId)) {
- result.addAll(getUserCalendars(managedUserId));
- }
- return result;
- }
-
- public final void refreshUserCalendars() {
- if (dataManager != null) {
- try {
- userCalendars.clear();
- for (CalendarPermission calendarsPermission : dataManager.getCalendarPermissions()) {
- getUserCalendarIds(calendarsPermission.getUserId()).add(calendarsPermission.getCalendarId());
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- }
-
- public Calendar getCalendar(long calendarId) {
- return calendars.get(calendarId);
- }
-
- public final void addCalendar(Calendar calendar) throws SQLException {
- dataManager.addCalendar(calendar);
- calendars.put(calendar.getId(), calendar);
- }
-
- public final void updateCalendar(Calendar calendar) throws SQLException {
- dataManager.updateCalendar(calendar);
- calendars.put(calendar.getId(), calendar);
- }
-
- public final void removeCalendar(long calendarId) throws SQLException {
- dataManager.removeCalendar(calendarId);
- calendars.remove(calendarId);
- refreshUserCalendars();
+ super(dataManager, Calendar.class, CalendarPermission.class);
+ refreshItems();
}
- public Collection<Calendar> getAllCalendars() {
- return calendars.values();
- }
-
- public boolean checkCalendar(long userId, long calendarId) {
- return getUserCalendarIds(userId).contains(calendarId);
- }
}
diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java
index 1c2a66bcf..4bf4b1b9a 100644
--- a/src/org/traccar/database/DataManager.java
+++ b/src/org/traccar/database/DataManager.java
@@ -38,31 +38,18 @@ import liquibase.resource.ResourceAccessor;
import org.traccar.Config;
import org.traccar.helper.Log;
import org.traccar.model.AttributeAlias;
-import org.traccar.model.AttributePermission;
-import org.traccar.model.Calendar;
-import org.traccar.model.CalendarPermission;
-import org.traccar.model.Attribute;
import org.traccar.model.Device;
-import org.traccar.model.DeviceAttribute;
-import org.traccar.model.DeviceDriver;
import org.traccar.model.DevicePermission;
-import org.traccar.model.Driver;
-import org.traccar.model.DriverPermission;
import org.traccar.model.Event;
-import org.traccar.model.Geofence;
import org.traccar.model.Group;
-import org.traccar.model.GroupAttribute;
-import org.traccar.model.GroupDriver;
-import org.traccar.model.GroupGeofence;
import org.traccar.model.GroupPermission;
+import org.traccar.model.Identifiable;
import org.traccar.model.Notification;
import org.traccar.model.Position;
import org.traccar.model.Server;
import org.traccar.model.Statistics;
import org.traccar.model.User;
import org.traccar.model.UserPermission;
-import org.traccar.model.DeviceGeofence;
-import org.traccar.model.GeofencePermission;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@@ -362,34 +349,6 @@ public class DataManager {
.executeQuery(Event.class);
}
- public Collection<Geofence> getGeofences() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectGeofencesAll"))
- .executeQuery(Geofence.class);
- }
-
- public void addGeofence(Geofence geofence) throws SQLException {
- geofence.setId(QueryBuilder.create(dataSource, getQuery("database.insertGeofence"), true)
- .setObject(geofence)
- .executeUpdate());
- }
-
- public void updateGeofence(Geofence geofence) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.updateGeofence"))
- .setObject(geofence)
- .executeUpdate();
- }
-
- public void removeGeofence(long geofenceId) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.deleteGeofence"))
- .setLong("id", geofenceId)
- .executeUpdate();
- }
-
- public Collection<GeofencePermission> getGeofencePermissions() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectGeofencePermissions"))
- .executeQuery(GeofencePermission.class);
- }
-
public void linkGeofence(long userId, long geofenceId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkGeofence"))
.setLong("userId", userId)
@@ -404,11 +363,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<GroupGeofence> getGroupGeofences() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectGroupGeofences"))
- .executeQuery(GroupGeofence.class);
- }
-
public void linkGroupGeofence(long groupId, long geofenceId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkGroupGeofence"))
.setLong("groupId", groupId)
@@ -423,11 +377,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<DeviceGeofence> getDeviceGeofences() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectDeviceGeofences"))
- .executeQuery(DeviceGeofence.class);
- }
-
public void linkDeviceGeofence(long deviceId, long geofenceId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkDeviceGeofence"))
.setLong("deviceId", deviceId)
@@ -501,34 +450,6 @@ public class DataManager {
.executeUpdate());
}
- public Collection<Calendar> getCalendars() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectCalendarsAll"))
- .executeQuery(Calendar.class);
- }
-
- public void addCalendar(Calendar calendar) throws SQLException {
- calendar.setId(QueryBuilder.create(dataSource, getQuery("database.insertCalendar"), true)
- .setObject(calendar)
- .executeUpdate());
- }
-
- public void updateCalendar(Calendar calendar) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.updateCalendar"))
- .setObject(calendar)
- .executeUpdate();
- }
-
- public void removeCalendar(long calendarId) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.deleteCalendar"))
- .setLong("id", calendarId)
- .executeUpdate();
- }
-
- public Collection<CalendarPermission> getCalendarPermissions() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectCalendarPermissions"))
- .executeQuery(CalendarPermission.class);
- }
-
public void linkCalendar(long userId, long calendarId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkCalendar"))
.setLong("userId", userId)
@@ -562,34 +483,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<Attribute> getAttributes() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectAttributes"))
- .executeQuery(Attribute.class);
- }
-
- public void addAttribute(Attribute attribute) throws SQLException {
- attribute.setId(QueryBuilder.create(dataSource, getQuery("database.insertAttribute"), true)
- .setObject(attribute)
- .executeUpdate());
- }
-
- public void updateAttribute(Attribute attribute) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.updateAttribute"))
- .setObject(attribute)
- .executeUpdate();
- }
-
- public void removeAttribute(long computedAttributeId) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.deleteAttribute"))
- .setLong("id", computedAttributeId)
- .executeUpdate();
- }
-
- public Collection<AttributePermission> getAttributePermissions() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectAttributePermissions"))
- .executeQuery(AttributePermission.class);
- }
-
public void linkAttribute(long userId, long attributeId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkAttribute"))
.setLong("userId", userId)
@@ -604,11 +497,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<GroupAttribute> getGroupAttributes() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectGroupAttributes"))
- .executeQuery(GroupAttribute.class);
- }
-
public void linkGroupAttribute(long groupId, long attributeId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkGroupAttribute"))
.setLong("groupId", groupId)
@@ -623,11 +511,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<DeviceAttribute> getDeviceAttributes() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectDeviceAttributes"))
- .executeQuery(DeviceAttribute.class);
- }
-
public void linkDeviceAttribute(long deviceId, long attributeId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkDeviceAttribute"))
.setLong("deviceId", deviceId)
@@ -642,34 +525,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<Driver> getDrivers() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectDrivers"))
- .executeQuery(Driver.class);
- }
-
- public void addDriver(Driver driver) throws SQLException {
- driver.setId(QueryBuilder.create(dataSource, getQuery("database.insertDriver"), true)
- .setObject(driver)
- .executeUpdate());
- }
-
- public void updateDriver(Driver driver) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.updateDriver"))
- .setObject(driver)
- .executeUpdate();
- }
-
- public void removeDriver(long driverId) throws SQLException {
- QueryBuilder.create(dataSource, getQuery("database.deleteDriver"))
- .setLong("id", driverId)
- .executeUpdate();
- }
-
- public Collection<DriverPermission> getDriverPermissions() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectDriverPermissions"))
- .executeQuery(DriverPermission.class);
- }
-
public void linkDriver(long userId, long driverId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkDriver"))
.setLong("userId", userId)
@@ -684,11 +539,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<GroupDriver> getGroupDrivers() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectGroupDrivers"))
- .executeQuery(GroupDriver.class);
- }
-
public void linkGroupDriver(long groupId, long driverId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkGroupDriver"))
.setLong("groupId", groupId)
@@ -703,11 +553,6 @@ public class DataManager {
.executeUpdate();
}
- public Collection<DeviceDriver> getDeviceDrivers() throws SQLException {
- return QueryBuilder.create(dataSource, getQuery("database.selectDeviceDrivers"))
- .executeQuery(DeviceDriver.class);
- }
-
public void linkDeviceDriver(long deviceId, long driverId) throws SQLException {
QueryBuilder.create(dataSource, getQuery("database.linkDeviceDriver"))
.setLong("deviceId", deviceId)
@@ -722,4 +567,30 @@ public class DataManager {
.executeUpdate();
}
+ public <T> Collection<T> getObjects(Class<T> clazz) throws SQLException {
+ String query = "database.select" + clazz.getSimpleName() + "s";
+ return QueryBuilder.create(dataSource, getQuery(query)).executeQuery(clazz);
+ }
+
+ public void addObject(Identifiable entity) throws SQLException {
+ String query = "database.insert" + entity.getClass().getSimpleName();
+ entity.setId(QueryBuilder.create(dataSource, getQuery(query), true)
+ .setObject(entity)
+ .executeUpdate());
+ }
+
+ public void updateObject(Identifiable entity) throws SQLException {
+ String query = "database.update" + entity.getClass().getSimpleName();
+ QueryBuilder.create(dataSource, getQuery(query))
+ .setObject(entity)
+ .executeUpdate();
+ }
+
+ public void removeObject(Class<? extends Identifiable> clazz, long entityId) throws SQLException {
+ String query = "database.delete" + clazz.getSimpleName();
+ QueryBuilder.create(dataSource, getQuery(query))
+ .setLong("id", entityId)
+ .executeUpdate();
+ }
+
}
diff --git a/src/org/traccar/database/DriversManager.java b/src/org/traccar/database/DriversManager.java
index e89d59311..391708f64 100644
--- a/src/org/traccar/database/DriversManager.java
+++ b/src/org/traccar/database/DriversManager.java
@@ -17,147 +17,53 @@
package org.traccar.database;
import java.sql.SQLException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedList;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import org.traccar.Context;
import org.traccar.helper.Log;
-import org.traccar.model.Device;
import org.traccar.model.DeviceDriver;
import org.traccar.model.Driver;
import org.traccar.model.DriverPermission;
import org.traccar.model.GroupDriver;
+import org.traccar.model.Identifiable;
-public class DriversManager {
+public class DriversManager extends ExtendedObjectManager {
- private final DataManager dataManager;
-
- private final Map<Long, Driver> drivers = new ConcurrentHashMap<>();
private final Map<String, Driver> driversByUniqueId = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> deviceDrivers = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> deviceDriversWithGroups = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> groupDrivers = new ConcurrentHashMap<>();
- private final Map<Long, Set<Long>> userDrivers = new ConcurrentHashMap<>();
public DriversManager(DataManager dataManager) {
- this.dataManager = dataManager;
- refreshDrivers();
- }
-
- public Set<Long> getUserDrivers(long userId) {
- if (!userDrivers.containsKey(userId)) {
- userDrivers.put(userId, new HashSet<Long>());
- }
- return userDrivers.get(userId);
- }
-
- public Set<Long> getGroupDrivers(long groupId) {
- if (!groupDrivers.containsKey(groupId)) {
- groupDrivers.put(groupId, new HashSet<Long>());
- }
- return groupDrivers.get(groupId);
- }
-
- public Set<Long> getDeviceDrivers(long deviceId) {
- return getDeviceDrivers(deviceDrivers, deviceId);
- }
-
- public Set<Long> getAllDeviceDrivers(long deviceId) {
- return getDeviceDrivers(deviceDriversWithGroups, deviceId);
- }
-
- private Set<Long> getDeviceDrivers(Map<Long, Set<Long>> deviceDrivers, long deviceId) {
- if (!deviceDrivers.containsKey(deviceId)) {
- deviceDrivers.put(deviceId, new HashSet<Long>());
- }
- return deviceDrivers.get(deviceId);
- }
-
- public final void refreshDrivers() {
- if (dataManager != null) {
- try {
- drivers.clear();
- driversByUniqueId.clear();
- for (Driver driver : dataManager.getDrivers()) {
- drivers.put(driver.getId(), driver);
- driversByUniqueId.put(driver.getUniqueId(), driver);
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- refreshUserDrivers();
+ super(dataManager, Driver.class, DriverPermission.class, DeviceDriver.class, GroupDriver.class);
+ refreshItems();
refresh();
}
- public final void refreshUserDrivers() {
- if (dataManager != null) {
+ @Override
+ public void refreshItems() {
+ if (getDataManager() != null) {
try {
- userDrivers.clear();
- for (DriverPermission driverPermission : dataManager.getDriverPermissions()) {
- getUserDrivers(driverPermission.getUserId()).add(driverPermission.getDriverId());
+ clearItems();
+ for (Identifiable item : getDataManager().getObjects(getBaseClass())) {
+ putItem(item.getId(), item);
+ driversByUniqueId.put(((Driver) item).getUniqueId(), (Driver) item);
}
} catch (SQLException error) {
Log.warning(error);
}
}
+ refreshUserItems();
}
- public final void refresh() {
- if (dataManager != null) {
- try {
-
- Collection<GroupDriver> databaseGroupDrivers = dataManager.getGroupDrivers();
-
- groupDrivers.clear();
- for (GroupDriver groupDriver : databaseGroupDrivers) {
- getGroupDrivers(groupDriver.getGroupId()).add(groupDriver.getDriverId());
- }
-
- Collection<DeviceDriver> databaseDeviceDrivers = dataManager.getDeviceDrivers();
- Collection<Device> allDevices = Context.getDeviceManager().getAllDevices();
-
- deviceDrivers.clear();
- deviceDriversWithGroups.clear();
-
- for (DeviceDriver deviceAttribute : databaseDeviceDrivers) {
- getDeviceDrivers(deviceAttribute.getDeviceId())
- .add(deviceAttribute.getDriverId());
- getAllDeviceDrivers(deviceAttribute.getDeviceId())
- .add(deviceAttribute.getDriverId());
- }
-
- for (Device device : allDevices) {
- long groupId = device.getGroupId();
- while (groupId != 0) {
- getAllDeviceDrivers(device.getId()).addAll(getGroupDrivers(groupId));
- if (Context.getDeviceManager().getGroupById(groupId) != null) {
- groupId = Context.getDeviceManager().getGroupById(groupId).getGroupId();
- } else {
- groupId = 0;
- }
- }
- }
-
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- }
-
- public void addDriver(Driver driver) throws SQLException {
- dataManager.addDriver(driver);
- drivers.put(driver.getId(), driver);
- driversByUniqueId.put(driver.getUniqueId(), driver);
+ @Override
+ public void addItem(Identifiable item) throws SQLException {
+ super.addItem(item);
+ driversByUniqueId.put(((Driver) item).getUniqueId(), (Driver) item);
}
- public void updateDriver(Driver driver) throws SQLException {
- dataManager.updateDriver(driver);
- Driver cachedDriver = drivers.get(driver.getId());
+ @Override
+ public void updateItem(Identifiable item) throws SQLException {
+ Driver driver = (Driver) item;
+ getDataManager().updateObject(driver);
+ Driver cachedDriver = (Driver) getById(driver.getId());
cachedDriver.setName(driver.getName());
if (!driver.getUniqueId().equals(cachedDriver.getUniqueId())) {
driversByUniqueId.remove(cachedDriver.getUniqueId());
@@ -167,47 +73,20 @@ public class DriversManager {
cachedDriver.setAttributes(driver.getAttributes());
}
- public void removeDriver(long driverId) throws SQLException {
- dataManager.removeDriver(driverId);
- if (drivers.containsKey(driverId)) {
- String driverUniqueId = drivers.get(driverId).getUniqueId();
- drivers.remove(driverId);
+ @Override
+ public void removeItem(long driverId) throws SQLException {
+ Driver cachedDriver = (Driver) getById(driverId);
+ getDataManager().removeObject(cachedDriver.getClass(), driverId);
+ if (cachedDriver != null) {
+ String driverUniqueId = cachedDriver.getUniqueId();
+ removeCachedItem(driverId);
driversByUniqueId.remove(driverUniqueId);
}
- refreshUserDrivers();
+ refreshUserItems();
refresh();
}
- public boolean checkDriver(long userId, long driverId) {
- return getUserDrivers(userId).contains(driverId);
- }
-
- public Driver getDriver(long id) {
- return drivers.get(id);
- }
-
public Driver getDriverByUniqueId(String uniqueId) {
return driversByUniqueId.get(uniqueId);
}
-
- public final Collection<Driver> getDrivers(Set<Long> driverIds) {
- Collection<Driver> result = new LinkedList<>();
- for (long driverId : driverIds) {
- result.add(getDriver(driverId));
- }
- return result;
- }
-
- public final Set<Long> getAllDrivers() {
- return drivers.keySet();
- }
-
- public final Set<Long> getManagedDrivers(long userId) {
- Set<Long> drivers = new HashSet<>();
- drivers.addAll(getUserDrivers(userId));
- for (long managedUserId : Context.getPermissionsManager().getUserPermissions(userId)) {
- drivers.addAll(getUserDrivers(managedUserId));
- }
- return drivers;
- }
}
diff --git a/src/org/traccar/database/ExtendedObjectManager.java b/src/org/traccar/database/ExtendedObjectManager.java
new file mode 100644
index 000000000..5147b9f9f
--- /dev/null
+++ b/src/org/traccar/database/ExtendedObjectManager.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org)
+ *
+ * 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.SQLException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.traccar.Context;
+import org.traccar.helper.Log;
+import org.traccar.model.BaseDevicePermission;
+import org.traccar.model.BaseGroupPermission;
+import org.traccar.model.BaseUserPermission;
+import org.traccar.model.Device;
+import org.traccar.model.Identifiable;
+
+public abstract class ExtendedObjectManager extends SimpleObjectManager {
+
+ private final Map<Long, Set<Long>> deviceItems = new ConcurrentHashMap<>();
+ private final Map<Long, Set<Long>> deviceItemsWithGroups = new ConcurrentHashMap<>();
+ private final Map<Long, Set<Long>> groupItems = new ConcurrentHashMap<>();
+
+ private Class<? extends BaseDevicePermission> devicePermissionClass;
+ private Class<? extends BaseGroupPermission> groupPermissionClass;
+
+ protected ExtendedObjectManager(DataManager dataManager,
+ Class<? extends Identifiable> baseClass,
+ Class<? extends BaseUserPermission> permissionClass,
+ Class<? extends BaseDevicePermission> devicePermissionClass,
+ Class<? extends BaseGroupPermission> groupPermissionClass) {
+ super(dataManager, baseClass, permissionClass);
+ this.devicePermissionClass = devicePermissionClass;
+ this.groupPermissionClass = groupPermissionClass;
+ }
+
+ public final Set<Long> getGroupItems(long groupId) {
+ if (!groupItems.containsKey(groupId)) {
+ groupItems.put(groupId, new HashSet<Long>());
+ }
+ return groupItems.get(groupId);
+ }
+
+ protected final void clearGroupItems() {
+ groupItems.clear();
+ }
+
+ public final Set<Long> getDeviceItems(long deviceId) {
+ if (!deviceItems.containsKey(deviceId)) {
+ deviceItems.put(deviceId, new HashSet<Long>());
+ }
+ return deviceItems.get(deviceId);
+ }
+
+ protected final void clearDeviceItems() {
+ deviceItems.clear();
+ }
+
+ public Set<Long> getAllDeviceItems(long deviceId) {
+ if (!deviceItemsWithGroups.containsKey(deviceId)) {
+ deviceItemsWithGroups.put(deviceId, new HashSet<Long>());
+ }
+ return deviceItemsWithGroups.get(deviceId);
+ }
+
+ @Override
+ public void removeItem(long itemId) throws SQLException {
+ super.removeItem(itemId);
+ refresh();
+ }
+
+ public void refresh() {
+ if (getDataManager() != null) {
+ try {
+
+ Collection<? extends BaseGroupPermission> databaseGroupPermissions =
+ getDataManager().getObjects(groupPermissionClass);
+
+ clearGroupItems();
+ for (BaseGroupPermission groupPermission : databaseGroupPermissions) {
+ getGroupItems(groupPermission.getGroupId()).add(groupPermission.getSlaveId());
+ }
+
+ Collection<? extends BaseDevicePermission> databaseDevicePermissions =
+ getDataManager().getObjects(devicePermissionClass);
+ Collection<Device> allDevices = Context.getDeviceManager().getAllDevices();
+
+ clearDeviceItems();
+ deviceItemsWithGroups.clear();
+
+ for (BaseDevicePermission devicePermission : databaseDevicePermissions) {
+ getDeviceItems(devicePermission.getDeviceId()).add(devicePermission.getSlaveId());
+ getAllDeviceItems(devicePermission.getDeviceId()).add(devicePermission.getSlaveId());
+ }
+
+ for (Device device : allDevices) {
+ long groupId = device.getGroupId();
+ while (groupId != 0) {
+ getAllDeviceItems(device.getId()).addAll(getGroupItems(groupId));
+ if (Context.getDeviceManager().getGroupById(groupId) != null) {
+ groupId = Context.getDeviceManager().getGroupById(groupId).getGroupId();
+ } else {
+ groupId = 0;
+ }
+ }
+ }
+
+ } catch (SQLException error) {
+ Log.warning(error);
+ }
+ }
+ }
+}
diff --git a/src/org/traccar/database/GeofenceManager.java b/src/org/traccar/database/GeofenceManager.java
index b8e6a5d73..868804d8f 100644
--- a/src/org/traccar/database/GeofenceManager.java
+++ b/src/org/traccar/database/GeofenceManager.java
@@ -15,20 +15,10 @@
*/
package org.traccar.database;
-import java.sql.SQLException;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.traccar.Context;
-import org.traccar.helper.Log;
import org.traccar.model.Device;
import org.traccar.model.DeviceGeofence;
import org.traccar.model.Geofence;
@@ -36,269 +26,45 @@ import org.traccar.model.GeofencePermission;
import org.traccar.model.GroupGeofence;
import org.traccar.model.Position;
-public class GeofenceManager {
-
- private final DataManager dataManager;
-
- private final Map<Long, Geofence> geofences = new HashMap<>();
- private final Map<Long, Set<Long>> userGeofences = new HashMap<>();
- private final Map<Long, Set<Long>> groupGeofences = new HashMap<>();
-
- private final Map<Long, Set<Long>> deviceGeofencesWithGroups = new HashMap<>();
- private final Map<Long, Set<Long>> deviceGeofences = new HashMap<>();
-
- private final ReadWriteLock deviceGeofencesLock = new ReentrantReadWriteLock();
- private final ReadWriteLock geofencesLock = new ReentrantReadWriteLock();
- private final ReadWriteLock groupGeofencesLock = new ReentrantReadWriteLock();
- private final ReadWriteLock userGeofencesLock = new ReentrantReadWriteLock();
+public class GeofenceManager extends ExtendedObjectManager {
public GeofenceManager(DataManager dataManager) {
- this.dataManager = dataManager;
- refreshGeofences();
- }
-
- private Set<Long> getUserGeofences(long userId) {
- if (!userGeofences.containsKey(userId)) {
- userGeofences.put(userId, new HashSet<Long>());
- }
- return userGeofences.get(userId);
- }
-
- public Set<Long> getUserGeofencesIds(long userId) {
- userGeofencesLock.readLock().lock();
- try {
- return getUserGeofences(userId);
- } finally {
- userGeofencesLock.readLock().unlock();
- }
- }
-
- private Set<Long> getGroupGeofences(long groupId) {
- if (!groupGeofences.containsKey(groupId)) {
- groupGeofences.put(groupId, new HashSet<Long>());
- }
- return groupGeofences.get(groupId);
- }
-
- public Set<Long> getGroupGeofencesIds(long groupId) {
- groupGeofencesLock.readLock().lock();
- try {
- return getGroupGeofences(groupId);
- } finally {
- groupGeofencesLock.readLock().unlock();
- }
- }
-
- public Set<Long> getAllDeviceGeofences(long deviceId) {
- deviceGeofencesLock.readLock().lock();
- try {
- return getDeviceGeofences(deviceGeofencesWithGroups, deviceId);
- } finally {
- deviceGeofencesLock.readLock().unlock();
- }
- }
-
- public Set<Long> getDeviceGeofencesIds(long deviceId) {
- deviceGeofencesLock.readLock().lock();
- try {
- return getDeviceGeofences(deviceGeofences, deviceId);
- } finally {
- deviceGeofencesLock.readLock().unlock();
- }
- }
-
- private Set<Long> getDeviceGeofences(Map<Long, Set<Long>> deviceGeofences, long deviceId) {
- if (!deviceGeofences.containsKey(deviceId)) {
- deviceGeofences.put(deviceId, new HashSet<Long>());
- }
- return deviceGeofences.get(deviceId);
- }
-
- public final void refreshGeofences() {
- if (dataManager != null) {
- try {
- geofencesLock.writeLock().lock();
- try {
- geofences.clear();
- for (Geofence geofence : dataManager.getGeofences()) {
- geofences.put(geofence.getId(), geofence);
- }
- } finally {
- geofencesLock.writeLock().unlock();
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- refreshUserGeofences();
+ super(dataManager, Geofence.class, GeofencePermission.class, DeviceGeofence.class, GroupGeofence.class);
+ refreshItems();
refresh();
}
- public final void refreshUserGeofences() {
- if (dataManager != null) {
- try {
- userGeofencesLock.writeLock().lock();
- try {
- userGeofences.clear();
- for (GeofencePermission geofencePermission : dataManager.getGeofencePermissions()) {
- getUserGeofences(geofencePermission.getUserId()).add(geofencePermission.getGeofenceId());
- }
- } finally {
- userGeofencesLock.writeLock().unlock();
- }
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- }
-
public final void refresh() {
- if (dataManager != null) {
- try {
-
- Collection<GroupGeofence> databaseGroupGeofences = dataManager.getGroupGeofences();
- groupGeofencesLock.writeLock().lock();
- try {
- groupGeofences.clear();
- for (GroupGeofence groupGeofence : databaseGroupGeofences) {
- getGroupGeofences(groupGeofence.getGroupId()).add(groupGeofence.getGeofenceId());
- }
- } finally {
- groupGeofencesLock.writeLock().unlock();
- }
-
- Collection<DeviceGeofence> databaseDeviceGeofences = dataManager.getDeviceGeofences();
- Collection<Device> allDevices = Context.getDeviceManager().getAllDevices();
-
- groupGeofencesLock.readLock().lock();
- deviceGeofencesLock.writeLock().lock();
- try {
- deviceGeofences.clear();
- deviceGeofencesWithGroups.clear();
-
- for (DeviceGeofence deviceGeofence : databaseDeviceGeofences) {
- getDeviceGeofences(deviceGeofences, deviceGeofence.getDeviceId())
- .add(deviceGeofence.getGeofenceId());
- getDeviceGeofences(deviceGeofencesWithGroups, deviceGeofence.getDeviceId())
- .add(deviceGeofence.getGeofenceId());
- }
-
- for (Device device : allDevices) {
- long groupId = device.getGroupId();
- while (groupId != 0) {
- getDeviceGeofences(deviceGeofencesWithGroups,
- device.getId()).addAll(getGroupGeofences(groupId));
- if (Context.getDeviceManager().getGroupById(groupId) != null) {
- groupId = Context.getDeviceManager().getGroupById(groupId).getGroupId();
- } else {
- groupId = 0;
- }
- }
- List<Long> deviceGeofenceIds = device.getGeofenceIds();
- if (deviceGeofenceIds == null) {
- deviceGeofenceIds = new ArrayList<>();
- } else {
- deviceGeofenceIds.clear();
- }
- Position lastPosition = Context.getIdentityManager().getLastPosition(device.getId());
- if (lastPosition != null && deviceGeofencesWithGroups.containsKey(device.getId())) {
- for (long geofenceId : deviceGeofencesWithGroups.get(device.getId())) {
- Geofence geofence = getGeofence(geofenceId);
- if (geofence != null && geofence.getGeometry()
- .containsPoint(lastPosition.getLatitude(), lastPosition.getLongitude())) {
- deviceGeofenceIds.add(geofenceId);
- }
- }
- }
- device.setGeofenceIds(deviceGeofenceIds);
- }
-
- } finally {
- deviceGeofencesLock.writeLock().unlock();
- groupGeofencesLock.readLock().unlock();
- }
-
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
- }
-
- public final Collection<Geofence> getAllGeofences() {
- geofencesLock.readLock().lock();
- try {
- return geofences.values();
- } finally {
- geofencesLock.readLock().unlock();
- }
- }
-
- public final Set<Long> getAllGeofencesIds() {
- geofencesLock.readLock().lock();
- try {
- return geofences.keySet();
- } finally {
- geofencesLock.readLock().unlock();
- }
- }
-
- public final Set<Long> getManagedGeofencesIds(long userId) {
- Set<Long> geofences = new HashSet<>();
- geofences.addAll(getUserGeofencesIds(userId));
- for (long managedUserId : Context.getPermissionsManager().getUserPermissions(userId)) {
- geofences.addAll(getUserGeofencesIds(managedUserId));
- }
- return geofences;
- }
-
- public final Collection<Geofence> getGeofences(Set<Long> geofencesIds) {
- geofencesLock.readLock().lock();
- try {
- Collection<Geofence> result = new LinkedList<>();
- for (long geofenceId : geofencesIds) {
- result.add(getGeofence(geofenceId));
- }
- return result;
- } finally {
- geofencesLock.readLock().unlock();
- }
- }
-
- public final Geofence getGeofence(long geofenceId) {
- geofencesLock.readLock().lock();
- try {
- return geofences.get(geofenceId);
- } finally {
- geofencesLock.readLock().unlock();
- }
- }
-
- public final void updateGeofence(Geofence geofence) {
- geofencesLock.writeLock().lock();
- try {
- geofences.put(geofence.getId(), geofence);
- } finally {
- geofencesLock.writeLock().unlock();
- }
- try {
- dataManager.updateGeofence(geofence);
- } catch (SQLException error) {
- Log.warning(error);
- }
- }
-
- public boolean checkGeofence(long userId, long geofenceId) {
- return getUserGeofencesIds(userId).contains(geofenceId);
+ super.refresh();
+ recalculateDevicesGeofences();
}
public List<Long> getCurrentDeviceGeofences(Position position) {
List<Long> result = new ArrayList<>();
- for (long geofenceId : getAllDeviceGeofences(position.getDeviceId())) {
- if (getGeofence(geofenceId).getGeometry().containsPoint(position.getLatitude(), position.getLongitude())) {
+ for (long geofenceId : getAllDeviceItems(position.getDeviceId())) {
+ Geofence geofence = (Geofence) getById(geofenceId);
+ if (geofence != null && geofence.getGeometry()
+ .containsPoint(position.getLatitude(), position.getLongitude())) {
result.add(geofenceId);
}
}
return result;
}
+ public void recalculateDevicesGeofences() {
+ for (Device device : Context.getDeviceManager().getAllDevices()) {
+ List<Long> deviceGeofenceIds = device.getGeofenceIds();
+ if (deviceGeofenceIds == null) {
+ deviceGeofenceIds = new ArrayList<>();
+ } else {
+ deviceGeofenceIds.clear();
+ }
+ Position lastPosition = Context.getIdentityManager().getLastPosition(device.getId());
+ if (lastPosition != null && getAllDeviceItems(device.getId()) != null) {
+ deviceGeofenceIds.addAll(getCurrentDeviceGeofences(lastPosition));
+ }
+ device.setGeofenceIds(deviceGeofenceIds);
+ }
+ }
+
}
diff --git a/src/org/traccar/database/NotificationManager.java b/src/org/traccar/database/NotificationManager.java
index 48caa615c..11d5a9aca 100644
--- a/src/org/traccar/database/NotificationManager.java
+++ b/src/org/traccar/database/NotificationManager.java
@@ -57,7 +57,7 @@ public class NotificationManager {
Set<Long> users = Context.getPermissionsManager().getDeviceUsers(event.getDeviceId());
for (long userId : users) {
if (event.getGeofenceId() == 0 || Context.getGeofenceManager() != null
- && Context.getGeofenceManager().checkGeofence(userId, event.getGeofenceId())) {
+ && Context.getGeofenceManager().checkItemPermission(userId, event.getGeofenceId())) {
Notification notification = getUserNotificationByType(userId, event.getType());
if (notification != null) {
if (notification.getWeb()) {
diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java
index 82ca6af49..f88e14bfe 100644
--- a/src/org/traccar/database/PermissionsManager.java
+++ b/src/org/traccar/database/PermissionsManager.java
@@ -298,52 +298,37 @@ public class PermissionsManager {
}
}
- public void checkGeofence(long userId, long geofenceId) throws SecurityException {
- if (!Context.getGeofenceManager().checkGeofence(userId, geofenceId) && !isAdmin(userId)) {
- checkManager(userId);
- for (long managedUserId : getUserPermissions(userId)) {
- if (Context.getGeofenceManager().checkGeofence(managedUserId, geofenceId)) {
- return;
- }
- }
- throw new SecurityException("Geofence access denied");
- }
- }
-
- public void checkAttribute(long userId, long attributeId) throws SecurityException {
- if (!Context.getAttributesManager().checkAttribute(userId, attributeId) && !isAdmin(userId)) {
- checkManager(userId);
- for (long managedUserId : getUserPermissions(userId)) {
- if (Context.getAttributesManager().checkAttribute(managedUserId, attributeId)) {
- return;
- }
- }
- throw new SecurityException("Attribute access denied");
- }
- }
-
- public void checkDriver(long userId, long driverId) throws SecurityException {
- if (!Context.getDriversManager().checkDriver(userId, driverId) && !isAdmin(userId)) {
- checkManager(userId);
- for (long managedUserId : getUserPermissions(userId)) {
- if (Context.getDriversManager().checkDriver(managedUserId, driverId)) {
- return;
- }
- }
- throw new SecurityException("Driver access denied");
- }
- }
-
-
- public void checkCalendar(long userId, long calendarId) throws SecurityException {
- if (!Context.getCalendarManager().checkCalendar(userId, calendarId) && !isAdmin(userId)) {
- checkManager(userId);
- for (long managedUserId : getUserPermissions(userId)) {
- if (Context.getCalendarManager().checkCalendar(managedUserId, calendarId)) {
- return;
+ public void checkPermission(String object, long userId, long objectId) throws SecurityException {
+ SimpleObjectManager manager = null;
+
+ switch (object) {
+ case "geofence":
+ manager = Context.getGeofenceManager();
+ break;
+ case "attribute":
+ manager = Context.getAttributesManager();
+ break;
+ case "driver":
+ manager = Context.getDriversManager();
+ break;
+ case "calendar":
+ manager = Context.getCalendarManager();
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown object type");
+ }
+
+ if (manager != null) {
+ if (manager.checkItemPermission(userId, objectId) && !isAdmin(userId)) {
+ checkManager(userId);
+ for (long managedUserId : getUserPermissions(userId)) {
+ if (manager.checkItemPermission(managedUserId, objectId)) {
+ return;
+ }
}
+ throw new SecurityException(object.substring(0, 1).toUpperCase() + object.substring(1)
+ + " access denied");
}
- throw new SecurityException("Calendar access denied");
}
}
diff --git a/src/org/traccar/database/SimpleObjectManager.java b/src/org/traccar/database/SimpleObjectManager.java
new file mode 100644
index 000000000..84d41a84f
--- /dev/null
+++ b/src/org/traccar/database/SimpleObjectManager.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org)
+ *
+ * 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.SQLException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.traccar.Context;
+import org.traccar.helper.Log;
+import org.traccar.model.BaseUserPermission;
+import org.traccar.model.Identifiable;
+
+public abstract class SimpleObjectManager {
+
+ private final DataManager dataManager;
+
+ private final Map<Long, Identifiable> items = new ConcurrentHashMap<>();
+ private final Map<Long, Set<Long>> userItems = new ConcurrentHashMap<>();
+
+ private Class<? extends Identifiable> baseClass;
+ private Class<? extends BaseUserPermission> permissionClass;
+
+ protected SimpleObjectManager(DataManager dataManager,
+ Class<? extends Identifiable> baseClass,
+ Class<? extends BaseUserPermission> permissionClass) {
+ this.dataManager = dataManager;
+ this.baseClass = baseClass;
+ this.permissionClass = permissionClass;
+ }
+
+ protected final DataManager getDataManager() {
+ return dataManager;
+ }
+
+ protected final Class<? extends Identifiable> getBaseClass() {
+ return baseClass;
+ }
+
+ public final Identifiable getById(long itemId) {
+ return items.get(itemId);
+ }
+
+ protected final void clearItems() {
+ items.clear();
+ }
+
+ protected final void putItem(long itemId, Identifiable item) {
+ items.put(itemId, item);
+ }
+
+ protected final void removeCachedItem(long itemId) {
+ items.remove(itemId);
+ }
+
+ public final Set<Long> getUserItems(long userId) {
+ if (!userItems.containsKey(userId)) {
+ userItems.put(userId, new HashSet<Long>());
+ }
+ return userItems.get(userId);
+ }
+
+ protected final void clearUserItems() {
+ userItems.clear();
+ }
+
+ public final boolean checkItemPermission(long userId, long itemId) {
+ return getUserItems(userId).contains(itemId);
+ }
+
+ public void refreshItems() {
+ if (dataManager != null) {
+ try {
+ clearItems();
+ for (Identifiable item : dataManager.getObjects(this.baseClass)) {
+ putItem(item.getId(), item);
+ }
+ } catch (SQLException error) {
+ Log.warning(error);
+ }
+ }
+ refreshUserItems();
+ }
+
+ public final void refreshUserItems() {
+ if (dataManager != null) {
+ try {
+ clearUserItems();
+ for (BaseUserPermission permission : dataManager.getObjects(this.permissionClass)) {
+ getUserItems(permission.getUserId()).add(permission.getSlaveId());
+ }
+ } catch (SQLException error) {
+ Log.warning(error);
+ }
+ }
+ }
+
+ public void addItem(Identifiable item) throws SQLException {
+ dataManager.addObject(item);
+ putItem(item.getId(), item);
+ }
+
+ public void updateItem(Identifiable item) throws SQLException {
+ dataManager.updateObject(item);
+ putItem(item.getId(), item);
+ }
+
+ public void removeItem(long itemId) throws SQLException {
+ Identifiable item = getById(itemId);
+ if (item != null) {
+ dataManager.removeObject(item.getClass(), itemId);
+ removeCachedItem(itemId);
+ }
+ refreshUserItems();
+ }
+
+// public final Collection<? extends Identifiable> getItems(Set<Long> itemIds) {
+// Collection<Identifiable> result = new LinkedList<>();
+// for (long itemId : itemIds) {
+// result.add(getById(itemId));
+// }
+// return result;
+// }
+
+ public final <T> Collection<T> getItems(Class<T> clazz, Set<Long> itemIds) {
+ Collection<T> result = new LinkedList<>();
+ for (long itemId : itemIds) {
+ result.add((T) getById(itemId));
+ }
+ return result;
+ }
+
+ public final Set<Long> getAllItems() {
+ return items.keySet();
+ }
+
+ public final Set<Long> getManagedItems(long userId) {
+ Set<Long> result = new HashSet<>();
+ result.addAll(getUserItems(userId));
+ for (long managedUserId : Context.getPermissionsManager().getUserPermissions(userId)) {
+ result.addAll(getUserItems(managedUserId));
+ }
+ return result;
+ }
+
+}