From b588b3c723cad4629dcecbce8983933f7ff2a255 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 14 Jun 2016 18:05:05 +0500 Subject: - Overlapping geofences - Simplified user-device link --- src/org/traccar/events/GeofenceEventHandler.java | 70 +++++++++++++----------- 1 file changed, 37 insertions(+), 33 deletions(-) (limited to 'src/org/traccar/events/GeofenceEventHandler.java') diff --git a/src/org/traccar/events/GeofenceEventHandler.java b/src/org/traccar/events/GeofenceEventHandler.java index bf9060ca1..ed63b6f7d 100644 --- a/src/org/traccar/events/GeofenceEventHandler.java +++ b/src/org/traccar/events/GeofenceEventHandler.java @@ -1,7 +1,9 @@ package org.traccar.events; import java.sql.SQLException; -import java.util.Set; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -25,50 +27,52 @@ public class GeofenceEventHandler extends BaseEventHandler { } @Override - protected Event analizePosition(Position position) { - Event event = null; - if (!isLastPosition() || !position.getValid()) { - return event; + protected Collection analizePosition(Position position) { + if (!isLastPosition() || !position.getValid()) { + return null; } Device device = dataManager.getDeviceById(position.getDeviceId()); if (device == null) { - return event; + return null; } - Set geofences = geofenceManager.getAllDeviceGeofences(position.getDeviceId()); - if (geofences == null) { - return event; - } - long geofenceId = 0; - for (Long geofence : geofences) { - if (geofenceManager.getGeofence(geofence).getGeometry() - .containsPoint(position.getLatitude(), position.getLongitude())) { - geofenceId = geofence; - break; - } + List currentGeofences = geofenceManager.getCurrentDeviceGeofences(position); + List oldGeofences = new ArrayList(); + if (device.getGeofenceIds() != null) { + oldGeofences.addAll(device.getGeofenceIds()); } + List newGeofences = new ArrayList(currentGeofences); + newGeofences.removeAll(oldGeofences); + oldGeofences.removeAll(currentGeofences); - if (device.getGeofenceId() != geofenceId) { - try { - if (geofenceId == 0) { - event = new Event(Event.TYPE_GEOFENCE_EXIT, position.getDeviceId(), position.getId()); - event.setGeofenceId(device.getGeofenceId()); - } else { - event = new Event(Event.TYPE_GEOFENCE_ENTER, position.getDeviceId(), position.getId()); + device.setGeofenceIds(currentGeofences); + + Collection events = new ArrayList<>(); + try { + if (dataManager.getLastEvents(position.getDeviceId(), + Event.TYPE_GEOFENCE_ENTER, suppressRepeated).isEmpty()) { + for (Long geofenceId : newGeofences) { + Event event = new Event(Event.TYPE_GEOFENCE_ENTER, position.getDeviceId(), position.getId()); event.setGeofenceId(geofenceId); + events.add(event); } - if (event != null && !dataManager.getLastEvents( - position.getDeviceId(), event.getType(), suppressRepeated).isEmpty()) { - event = null; + } + } catch (SQLException error) { + Log.warning(error); + } + try { + if (dataManager.getLastEvents(position.getDeviceId(), + Event.TYPE_GEOFENCE_EXIT, suppressRepeated).isEmpty()) { + for (Long geofenceId : oldGeofences) { + Event event = new Event(Event.TYPE_GEOFENCE_EXIT, position.getDeviceId(), position.getId()); + event.setGeofenceId(geofenceId); + events.add(event); } - device.setGeofenceId(geofenceId); - dataManager.updateDeviceStatus(device); - } catch (SQLException error) { - Log.warning(error); } - + } catch (SQLException error) { + Log.warning(error); } - return event; + return events; } } -- cgit v1.2.3