diff options
Diffstat (limited to 'src/org')
-rw-r--r-- | src/org/traccar/api/resource/GeofenceResource.java | 25 | ||||
-rw-r--r-- | src/org/traccar/database/GeofenceManager.java | 25 |
2 files changed, 43 insertions, 7 deletions
diff --git a/src/org/traccar/api/resource/GeofenceResource.java b/src/org/traccar/api/resource/GeofenceResource.java index 9c80e61a1..e94e3fedb 100644 --- a/src/org/traccar/api/resource/GeofenceResource.java +++ b/src/org/traccar/api/resource/GeofenceResource.java @@ -17,6 +17,7 @@ package org.traccar.api.resource; import org.traccar.Context; import org.traccar.api.BaseResource; +import org.traccar.database.GeofenceManager; import org.traccar.model.Geofence; import javax.ws.rs.Consumes; @@ -33,6 +34,8 @@ import javax.ws.rs.core.Response; import java.sql.SQLException; import java.util.Collection; +import java.util.HashSet; +import java.util.Set; @Path("geofences") @Produces(MediaType.APPLICATION_JSON) @@ -41,17 +44,33 @@ public class GeofenceResource extends BaseResource { @GET public Collection<Geofence> get( - @QueryParam("all") boolean all, @QueryParam("userId") long userId) throws SQLException { + @QueryParam("all") boolean all, @QueryParam("userId") long userId, @QueryParam("groupId") long groupId, + @QueryParam("deviceId") long deviceId) throws SQLException { + + GeofenceManager geofenceManager = Context.getGeofenceManager(); + Set<Long> result; if (all) { Context.getPermissionsManager().checkAdmin(getUserId()); - return Context.getGeofenceManager().getAllGeofences(); + result = new HashSet<>(geofenceManager.getAllGeofencesIds()); } else { if (userId == 0) { userId = getUserId(); } Context.getPermissionsManager().checkUser(getUserId(), userId); - return Context.getGeofenceManager().getUserGeofences(userId); + result = new HashSet<Long>(geofenceManager.getUserGeofencesIds(userId)); + } + + if (groupId != 0) { + Context.getPermissionsManager().checkGroup(getUserId(), groupId); + result.retainAll(geofenceManager.getGroupGeofencesIds(groupId)); } + + if (deviceId != 0) { + Context.getPermissionsManager().checkDevice(getUserId(), deviceId); + result.retainAll(geofenceManager.getDeviceGeofencesIds(deviceId)); + } + return Context.getGeofenceManager().getGeofences(result); + } @POST diff --git a/src/org/traccar/database/GeofenceManager.java b/src/org/traccar/database/GeofenceManager.java index 0a07e2cf3..3f4d4c5ce 100644 --- a/src/org/traccar/database/GeofenceManager.java +++ b/src/org/traccar/database/GeofenceManager.java @@ -70,6 +70,15 @@ public class GeofenceManager { 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 { @@ -77,10 +86,9 @@ public class GeofenceManager { } finally { deviceGeofencesLock.readLock().unlock(); } - } - public Set<Long> getDeviceGeofences(long deviceId) { + public Set<Long> getDeviceGeofencesIds(long deviceId) { deviceGeofencesLock.readLock().lock(); try { return getDeviceGeofences(deviceGeofences, deviceId); @@ -174,11 +182,20 @@ public class GeofenceManager { } } - public final Collection<Geofence> getUserGeofences(long userId) { + public final Set<Long> getAllGeofencesIds() { + geofencesLock.readLock().lock(); + try { + return geofences.keySet(); + } finally { + geofencesLock.readLock().unlock(); + } + } + + public final Collection<Geofence> getGeofences(Set<Long> geofencesIds) { geofencesLock.readLock().lock(); try { Collection<Geofence> result = new LinkedList<>(); - for (Long geofenceId : getUserGeofencesIds(userId)) { + for (Long geofenceId : geofencesIds) { result.add(getGeofence(geofenceId)); } return result; |