aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/database/AttributesManager.java
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2017-05-13 11:01:48 +1200
committerGitHub <noreply@github.com>2017-05-13 11:01:48 +1200
commit713d6c55a007aa80850810f447308976516bfa63 (patch)
tree057e9147e724a56b6e2f3820fcf3d9ab67561fdf /src/org/traccar/database/AttributesManager.java
parent51920cae6438f8888090f177761a82afff33067f (diff)
parent6c17f85d04b224ff2a09265918765c9f4fc8cf94 (diff)
downloadtrackermap-server-713d6c55a007aa80850810f447308976516bfa63.tar.gz
trackermap-server-713d6c55a007aa80850810f447308976516bfa63.tar.bz2
trackermap-server-713d6c55a007aa80850810f447308976516bfa63.zip
Merge pull request #3156 from Abyss777/computed_attributes
Implement computed attributes
Diffstat (limited to 'src/org/traccar/database/AttributesManager.java')
-rw-r--r--src/org/traccar/database/AttributesManager.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/src/org/traccar/database/AttributesManager.java b/src/org/traccar/database/AttributesManager.java
new file mode 100644
index 000000000..362d6130f
--- /dev/null
+++ b/src/org/traccar/database/AttributesManager.java
@@ -0,0 +1,199 @@
+/*
+ * 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.AttributePermission;
+import org.traccar.model.Attribute;
+import org.traccar.model.Device;
+import org.traccar.model.DeviceAttribute;
+import org.traccar.model.GroupAttribute;
+
+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 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();
+ 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());
+ 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;
+ }
+
+}