diff options
Diffstat (limited to 'src/org/traccar/database/SimpleObjectManager.java')
-rw-r--r-- | src/org/traccar/database/SimpleObjectManager.java | 137 |
1 files changed, 25 insertions, 112 deletions
diff --git a/src/org/traccar/database/SimpleObjectManager.java b/src/org/traccar/database/SimpleObjectManager.java index 124178a05..0b4d11378 100644 --- a/src/org/traccar/database/SimpleObjectManager.java +++ b/src/org/traccar/database/SimpleObjectManager.java @@ -17,9 +17,7 @@ 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; @@ -30,43 +28,16 @@ import org.traccar.model.BaseModel; import org.traccar.model.Permission; import org.traccar.model.User; -public abstract class SimpleObjectManager { +public abstract class SimpleObjectManager<T extends BaseModel> extends BaseObjectManager<T> + implements ManagableObjects { - private final DataManager dataManager; + private Map<Long, Set<Long>> userItems; - private Map<Long, BaseModel> items; - private final Map<Long, Set<Long>> userItems = new ConcurrentHashMap<>(); - - private Class<? extends BaseModel> baseClass; - private String baseClassIdName; - - protected SimpleObjectManager(DataManager dataManager, Class<? extends BaseModel> baseClass) { - this.dataManager = dataManager; - this.baseClass = baseClass; - baseClassIdName = DataManager.makeNameId(baseClass); - refreshItems(); - } - - protected final DataManager getDataManager() { - return dataManager; - } - - protected final Class<? extends BaseModel> getBaseClass() { - return baseClass; - } - - protected final String getBaseClassIdName() { - return baseClassIdName; - } - - public final BaseModel getById(long itemId) { - return items.get(itemId); - } - - protected final void clearItems() { - items.clear(); + protected SimpleObjectManager(DataManager dataManager, Class<T> baseClass) { + super(dataManager, baseClass); } + @Override public final Set<Long> getUserItems(long userId) { if (!userItems.containsKey(userId)) { userItems.put(userId, new HashSet<Long>()); @@ -74,47 +45,35 @@ public abstract class SimpleObjectManager { return userItems.get(userId); } - protected final void clearUserItems() { - userItems.clear(); + @Override + public Set<Long> getManagedItems(long userId) { + Set<Long> result = new HashSet<>(); + result.addAll(getUserItems(userId)); + for (long managedUserId : Context.getUsersManager().getUserItems(userId)) { + result.addAll(getUserItems(managedUserId)); + } + return result; } public final boolean checkItemPermission(long userId, long itemId) { return getUserItems(userId).contains(itemId); } + @Override public void refreshItems() { - if (dataManager != null) { - try { - Collection<? extends BaseModel> databaseItems = dataManager.getObjects(baseClass); - if (items == null) { - items = new ConcurrentHashMap<>(databaseItems.size()); - } - Set<Long> databaseItemIds = new HashSet<>(); - for (BaseModel item : databaseItems) { - databaseItemIds.add(item.getId()); - if (items.containsKey(item.getId())) { - updateCachedItem(item); - } else { - addNewItem(item); - } - } - for (Long cachedItemId : items.keySet()) { - if (!databaseItemIds.contains(cachedItemId)) { - removeCachedItem(cachedItemId); - } - } - } catch (SQLException error) { - Log.warning(error); - } - } + super.refreshItems(); refreshUserItems(); } public final void refreshUserItems() { - if (dataManager != null) { + if (getDataManager() != null) { try { - clearUserItems(); - for (Permission permission : dataManager.getPermissions(User.class, baseClass)) { + if (userItems != null) { + userItems.clear(); + } else { + userItems = new ConcurrentHashMap<>(); + } + for (Permission permission : getDataManager().getPermissions(User.class, getBaseClass())) { getUserItems(permission.getOwnerId()).add(permission.getPropertyId()); } } catch (SQLException | ClassNotFoundException error) { @@ -123,56 +82,10 @@ public abstract class SimpleObjectManager { } } - protected void addNewItem(BaseModel item) { - items.put(item.getId(), item); - } - - public void addItem(BaseModel item) throws SQLException { - dataManager.addObject(item); - addNewItem(item); - } - - protected void updateCachedItem(BaseModel item) { - items.put(item.getId(), item); - } - - public void updateItem(BaseModel item) throws SQLException { - dataManager.updateObject(item); - updateCachedItem(item); - } - - protected void removeCachedItem(long itemId) { - items.remove(itemId); - } - + @Override public void removeItem(long itemId) throws SQLException { - BaseModel item = getById(itemId); - if (item != null) { - dataManager.removeObject(baseClass, itemId); - removeCachedItem(itemId); - } + super.removeItem(itemId); refreshUserItems(); } - 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 Set<Long> getManagedItems(long userId) { - Set<Long> result = new HashSet<>(); - result.addAll(getUserItems(userId)); - for (long managedUserId : Context.getUsersManager().getManagedItems(userId)) { - result.addAll(getUserItems(managedUserId)); - } - return result; - } - } |