aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/traccar/api/BaseObjectResource.java4
-rw-r--r--src/main/java/org/traccar/session/cache/CacheManager.java35
2 files changed, 23 insertions, 16 deletions
diff --git a/src/main/java/org/traccar/api/BaseObjectResource.java b/src/main/java/org/traccar/api/BaseObjectResource.java
index c033fbb62..eb1db5e89 100644
--- a/src/main/java/org/traccar/api/BaseObjectResource.java
+++ b/src/main/java/org/traccar/api/BaseObjectResource.java
@@ -106,7 +106,7 @@ public abstract class BaseObjectResource<T extends BaseModel> extends BaseResour
new Columns.Exclude("id"),
new Condition.Equals("id", "id")));
}
- cacheManager.updateOrInvalidate(baseClass, entity.getId());
+ cacheManager.updateOrInvalidate(entity);
LogAction.edit(getUserId(), entity);
@@ -135,7 +135,7 @@ public abstract class BaseObjectResource<T extends BaseModel> extends BaseResour
} else {
storage.removeObject(baseClass, new Request(new Condition.Equals("id", "id", id)));
}
- cacheManager.updateOrInvalidate(baseClass, id);
+ cacheManager.invalidate(baseClass, id);
LogAction.remove(getUserId(), baseClass, id);
diff --git a/src/main/java/org/traccar/session/cache/CacheManager.java b/src/main/java/org/traccar/session/cache/CacheManager.java
index 8e1737441..a934431be 100644
--- a/src/main/java/org/traccar/session/cache/CacheManager.java
+++ b/src/main/java/org/traccar/session/cache/CacheManager.java
@@ -136,36 +136,43 @@ public class CacheManager {
}
}
- public void updateOrInvalidate(Class<? extends BaseModel> clazz, long id) throws StorageException {
- boolean invalidate = false;
- var before = getObject(clazz, id);
- var after = storage.getObject(clazz, new Request(
+ public <T extends BaseModel> void updateOrInvalidate(Class<T> clazz, long id) throws StorageException {
+ var object = storage.getObject(clazz, new Request(
new Columns.All(), new Condition.Equals("id", "id", id)));
+ if (object != null) {
+ updateOrInvalidate(object);
+ } else {
+ invalidate(clazz, id);
+ }
+ }
+
+ public <T extends BaseModel> void updateOrInvalidate(T object) throws StorageException {
+ boolean invalidate = false;
+ var before = getObject(object.getClass(), object.getId());
if (before == null) {
return;
- } else if (after == null) {
- invalidate = true;
- } else if (clazz.isInstance(GroupedModel.class)) {
- if (((GroupedModel) before).getGroupId() != ((GroupedModel) after).getGroupId()) {
+ } else if (object instanceof GroupedModel) {
+ if (((GroupedModel) before).getGroupId() != ((GroupedModel) object).getGroupId()) {
invalidate = true;
}
}
if (invalidate) {
- invalidate(new CacheKey(clazz, id));
+ invalidate(object.getClass(), object.getId());
} else {
+ // TODO if device, also need to update geofences
try {
lock.writeLock().lock();
- var cacheValue = deviceCache.get(new CacheKey(clazz, id));
- if (cacheValue != null) {
- cacheValue.setValue(after);
- }
- // TODO if device, also need to update geofences
+ deviceCache.get(new CacheKey(object.getClass(), object.getId())).setValue(object);
} finally {
lock.writeLock().unlock();
}
}
}
+ public <T extends BaseModel> void invalidate(Class<T> clazz, long id) throws StorageException {
+ invalidate(new CacheKey(clazz, id));
+ }
+
public void invalidate(
Class<? extends BaseModel> clazz1, long id1,
Class<? extends BaseModel> clazz2, long id2) throws StorageException {