aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2019-03-07 21:21:22 -0800
committerAnton Tananaev <anton.tananaev@gmail.com>2019-03-07 21:21:22 -0800
commitbf51c1994531da91f364b81d6d8c0778ed9c3570 (patch)
treed39930217931b52a763162dc946c72822a524d9b
parent4e68a40c77240800dce14094b4cc55907410c208 (diff)
downloadtrackermap-server-bf51c1994531da91f364b81d6d8c0778ed9c3570.tar.gz
trackermap-server-bf51c1994531da91f364b81d6d8c0778ed9c3570.tar.bz2
trackermap-server-bf51c1994531da91f364b81d6d8c0778ed9c3570.zip
Refactor overspeed handler
-rw-r--r--src/org/traccar/BasePipelineFactory.java4
-rw-r--r--src/org/traccar/Context.java11
-rw-r--r--src/org/traccar/MainModule.java20
-rw-r--r--src/org/traccar/config/Keys.java18
-rw-r--r--src/org/traccar/database/ConnectionManager.java6
-rw-r--r--src/org/traccar/handler/events/OverspeedEventHandler.java43
-rw-r--r--test/org/traccar/handler/events/OverspeedEventHandlerTest.java18
7 files changed, 83 insertions, 37 deletions
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index 1366850c0..0187e1d3f 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -58,7 +58,6 @@ public abstract class BasePipelineFactory extends ChannelInitializer<Channel> {
private boolean eventsEnabled;
private int timeout;
- private OverspeedEventHandler overspeedEventHandler;
private FuelDropEventHandler fuelDropEventHandler;
private MotionEventHandler motionEventHandler;
private GeofenceEventHandler geofenceEventHandler;
@@ -76,7 +75,6 @@ public abstract class BasePipelineFactory extends ChannelInitializer<Channel> {
}
if (eventsEnabled) {
- overspeedEventHandler = Context.getOverspeedEventHandler();
fuelDropEventHandler = new FuelDropEventHandler();
motionEventHandler = Context.getMotionEventHandler();
geofenceEventHandler = new GeofenceEventHandler();
@@ -161,7 +159,7 @@ public abstract class BasePipelineFactory extends ChannelInitializer<Channel> {
addHandlers(
pipeline,
Main.getInjector().getInstance(CommandResultEventHandler.class),
- overspeedEventHandler,
+ Main.getInjector().getInstance(OverspeedEventHandler.class),
fuelDropEventHandler,
motionEventHandler,
geofenceEventHandler,
diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java
index 627299c01..845dae3c6 100644
--- a/src/org/traccar/Context.java
+++ b/src/org/traccar/Context.java
@@ -42,7 +42,6 @@ import org.traccar.database.NotificationManager;
import org.traccar.database.PermissionsManager;
import org.traccar.database.UsersManager;
import org.traccar.handler.events.MotionEventHandler;
-import org.traccar.handler.events.OverspeedEventHandler;
import org.traccar.geocoder.Geocoder;
import org.traccar.helper.Log;
import org.traccar.helper.SanitizerModule;
@@ -245,12 +244,6 @@ public final class Context {
return motionEventHandler;
}
- private static OverspeedEventHandler overspeedEventHandler;
-
- public static OverspeedEventHandler getOverspeedEventHandler() {
- return overspeedEventHandler;
- }
-
private static TripsConfig tripsConfig;
public static TripsConfig getTripsConfig() {
@@ -387,10 +380,6 @@ public final class Context {
velocityEngine.init(velocityProperties);
motionEventHandler = new MotionEventHandler(tripsConfig);
- overspeedEventHandler = new OverspeedEventHandler(
- Context.getConfig().getLong("event.overspeed.minimalDuration") * 1000,
- Context.getConfig().getBoolean("event.overspeed.notRepeat"),
- Context.getConfig().getBoolean("event.overspeed.preferLowest"));
}
public static void init(IdentityManager testIdentityManager, MediaManager testMediaManager) {
diff --git a/src/org/traccar/MainModule.java b/src/org/traccar/MainModule.java
index cfd280c9f..fe280d7a3 100644
--- a/src/org/traccar/MainModule.java
+++ b/src/org/traccar/MainModule.java
@@ -23,6 +23,8 @@ import org.traccar.config.Config;
import org.traccar.config.Keys;
import org.traccar.database.AttributesManager;
import org.traccar.database.DataManager;
+import org.traccar.database.DeviceManager;
+import org.traccar.database.GeofenceManager;
import org.traccar.database.IdentityManager;
import org.traccar.database.StatisticsManager;
import org.traccar.geocoder.AddressFormat;
@@ -55,6 +57,7 @@ import org.traccar.handler.HemisphereHandler;
import org.traccar.handler.MotionHandler;
import org.traccar.handler.RemoteAddressHandler;
import org.traccar.handler.events.CommandResultEventHandler;
+import org.traccar.handler.events.OverspeedEventHandler;
import org.traccar.reports.model.TripsConfig;
import javax.annotation.Nullable;
@@ -93,6 +96,16 @@ public class MainModule extends AbstractModule {
}
@Provides
+ public static DeviceManager provideDeviceManager() {
+ return Context.getDeviceManager();
+ }
+
+ @Provides
+ public static GeofenceManager provideGeofenceManager() {
+ return Context.getGeofenceManager();
+ }
+
+ @Provides
public static AttributesManager provideAttributesManager() {
return Context.getAttributesManager();
}
@@ -271,6 +284,13 @@ public class MainModule extends AbstractModule {
return new CommandResultEventHandler();
}
+ @Singleton
+ @Provides
+ public static OverspeedEventHandler provideOverspeedEventHandler(
+ Config config, DeviceManager deviceManager, GeofenceManager geofenceManager) {
+ return new OverspeedEventHandler(config, deviceManager, geofenceManager);
+ }
+
@Override
protected void configure() {
binder().requireExplicitBindings();
diff --git a/src/org/traccar/config/Keys.java b/src/org/traccar/config/Keys.java
index dc5560daf..c7c5d16c6 100644
--- a/src/org/traccar/config/Keys.java
+++ b/src/org/traccar/config/Keys.java
@@ -46,6 +46,24 @@ public final class Keys {
"event.enable", Boolean.class);
/**
+ * If true, the event is generated once at the beginning of overspeeding period.
+ */
+ public static final ConfigKey EVENT_OVERSPEED_NOT_REPEAT = new ConfigKey(
+ "event.overspeed.notRepeat", Boolean.class);
+
+ /**
+ * Minimal over speed duration to trigger the event. Value in seconds.
+ */
+ public static final ConfigKey EVENT_OVERSPEED_MINIMAL_DURATION = new ConfigKey(
+ "event.overspeed.minimalDuration", Long.class);
+
+ /**
+ * Relevant only for geofence speed limits. Use lowest speed limits from all geofences.
+ */
+ public static final ConfigKey EVENT_OVERSPEED_PREFER_LOWEST = new ConfigKey(
+ "event.overspeed.preferLowest", Boolean.class);
+
+ /**
* List of external handler classes to use in Netty pipeline.
*/
public static final ConfigKey EXTRA_HANDLERS = new ConfigKey(
diff --git a/src/org/traccar/database/ConnectionManager.java b/src/org/traccar/database/ConnectionManager.java
index fc52fc375..157f2d0a8 100644
--- a/src/org/traccar/database/ConnectionManager.java
+++ b/src/org/traccar/database/ConnectionManager.java
@@ -22,6 +22,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.traccar.Context;
import org.traccar.GlobalTimer;
+import org.traccar.Main;
import org.traccar.Protocol;
import org.traccar.handler.events.OverspeedEventHandler;
import org.traccar.model.Device;
@@ -152,8 +153,9 @@ public class ConnectionManager {
result.putAll(event);
}
- event = Context.getOverspeedEventHandler().updateOverspeedState(deviceState, Context.getDeviceManager().
- lookupAttributeDouble(deviceId, OverspeedEventHandler.ATTRIBUTE_SPEED_LIMIT, 0, false));
+ event = Main.getInjector().getInstance(OverspeedEventHandler.class)
+ .updateOverspeedState(deviceState, Context.getDeviceManager().
+ lookupAttributeDouble(deviceId, OverspeedEventHandler.ATTRIBUTE_SPEED_LIMIT, 0, false));
if (event != null) {
result.putAll(event);
}
diff --git a/src/org/traccar/handler/events/OverspeedEventHandler.java b/src/org/traccar/handler/events/OverspeedEventHandler.java
index 34344fb47..157bb64e0 100644
--- a/src/org/traccar/handler/events/OverspeedEventHandler.java
+++ b/src/org/traccar/handler/events/OverspeedEventHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2019 Anton Tananaev (anton@traccar.org)
* Copyright 2018 Andrey Kunitsyn (andrey@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,10 @@ import java.util.Collections;
import java.util.Map;
import io.netty.channel.ChannelHandler;
-import org.traccar.Context;
+import org.traccar.config.Config;
+import org.traccar.config.Keys;
+import org.traccar.database.DeviceManager;
+import org.traccar.database.GeofenceManager;
import org.traccar.model.Device;
import org.traccar.model.DeviceState;
import org.traccar.model.Event;
@@ -30,22 +33,28 @@ import org.traccar.model.Position;
@ChannelHandler.Sharable
public class OverspeedEventHandler extends BaseEventHandler {
+ public static final String ATTRIBUTE_SPEED = "speed";
public static final String ATTRIBUTE_SPEED_LIMIT = "speedLimit";
- private boolean notRepeat;
- private boolean preferLowest;
- private long minimalDuration;
+ private final DeviceManager deviceManager;
+ private final GeofenceManager geofenceManager;
- public OverspeedEventHandler(long minimalDuration, boolean notRepeat, boolean preferLowest) {
- this.notRepeat = notRepeat;
- this.minimalDuration = minimalDuration;
- this.preferLowest = preferLowest;
+ private final boolean notRepeat;
+ private final long minimalDuration;
+ private final boolean preferLowest;
+
+ public OverspeedEventHandler(Config config, DeviceManager deviceManager, GeofenceManager geofenceManager) {
+ this.deviceManager = deviceManager;
+ this.geofenceManager = geofenceManager;
+ notRepeat = config.getBoolean(Keys.EVENT_OVERSPEED_NOT_REPEAT);
+ minimalDuration = config.getLong(Keys.EVENT_OVERSPEED_MINIMAL_DURATION) * 1000;
+ preferLowest = config.getBoolean(Keys.EVENT_OVERSPEED_PREFER_LOWEST);
}
private Map<Event, Position> newEvent(DeviceState deviceState, double speedLimit) {
Position position = deviceState.getOverspeedPosition();
Event event = new Event(Event.TYPE_DEVICE_OVERSPEED, position.getDeviceId(), position.getId());
- event.set("speed", deviceState.getOverspeedPosition().getSpeed());
+ event.set(ATTRIBUTE_SPEED, deviceState.getOverspeedPosition().getSpeed());
event.set(ATTRIBUTE_SPEED_LIMIT, speedLimit);
event.setGeofenceId(deviceState.getOverspeedGeofenceId());
deviceState.setOverspeedState(notRepeat);
@@ -103,22 +112,22 @@ public class OverspeedEventHandler extends BaseEventHandler {
protected Map<Event, Position> analyzePosition(Position position) {
long deviceId = position.getDeviceId();
- Device device = Context.getIdentityManager().getById(deviceId);
+ Device device = deviceManager.getById(deviceId);
if (device == null) {
return null;
}
- if (!Context.getIdentityManager().isLatestPosition(position) || !position.getValid()) {
+ if (!deviceManager.isLatestPosition(position) || !position.getValid()) {
return null;
}
- double speedLimit = Context.getDeviceManager().lookupAttributeDouble(deviceId, ATTRIBUTE_SPEED_LIMIT, 0, false);
+ double speedLimit = deviceManager.lookupAttributeDouble(deviceId, ATTRIBUTE_SPEED_LIMIT, 0, false);
double geofenceSpeedLimit = 0;
long overspeedGeofenceId = 0;
- if (Context.getGeofenceManager() != null && device.getGeofenceIds() != null) {
+ if (geofenceManager != null && device.getGeofenceIds() != null) {
for (long geofenceId : device.getGeofenceIds()) {
- Geofence geofence = Context.getGeofenceManager().getById(geofenceId);
+ Geofence geofence = geofenceManager.getById(geofenceId);
if (geofence != null) {
double currentSpeedLimit = geofence.getDouble(ATTRIBUTE_SPEED_LIMIT);
if (currentSpeedLimit > 0 && geofenceSpeedLimit == 0
@@ -139,7 +148,7 @@ public class OverspeedEventHandler extends BaseEventHandler {
}
Map<Event, Position> result = null;
- DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId);
+ DeviceState deviceState = deviceManager.getDeviceState(deviceId);
if (deviceState.getOverspeedState() == null) {
deviceState.setOverspeedState(position.getSpeed() > speedLimit);
@@ -148,7 +157,7 @@ public class OverspeedEventHandler extends BaseEventHandler {
result = updateOverspeedState(deviceState, position, speedLimit, overspeedGeofenceId);
}
- Context.getDeviceManager().setDeviceState(deviceId, deviceState);
+ deviceManager.setDeviceState(deviceId, deviceState);
return result;
}
diff --git a/test/org/traccar/handler/events/OverspeedEventHandlerTest.java b/test/org/traccar/handler/events/OverspeedEventHandlerTest.java
index 584ac271a..515f37b5d 100644
--- a/test/org/traccar/handler/events/OverspeedEventHandlerTest.java
+++ b/test/org/traccar/handler/events/OverspeedEventHandlerTest.java
@@ -14,6 +14,8 @@ import java.util.TimeZone;
import org.junit.Test;
import org.traccar.BaseTest;
+import org.traccar.config.Config;
+import org.traccar.config.Keys;
import org.traccar.model.DeviceState;
import org.traccar.model.Event;
import org.traccar.model.Position;
@@ -26,8 +28,12 @@ public class OverspeedEventHandlerTest extends BaseTest {
return dateFormat.parse(time);
}
- private void testOverspeedWithPosition(boolean notRepeat, long geofenceId) throws Exception {
- OverspeedEventHandler overspeedEventHandler = new OverspeedEventHandler(15000, notRepeat, false);
+ private void testOverspeedWithPosition(boolean notRepeat, long geofenceId) throws ParseException {
+ Config config = new Config();
+ config.setString(Keys.EVENT_OVERSPEED_NOT_REPEAT, String.valueOf(notRepeat));
+ config.setString(Keys.EVENT_OVERSPEED_MINIMAL_DURATION, String.valueOf(15));
+ config.setString(Keys.EVENT_OVERSPEED_PREFER_LOWEST, String.valueOf(false));
+ OverspeedEventHandler overspeedEventHandler = new OverspeedEventHandler(config, null, null);
Position position = new Position();
position.setTime(date("2017-01-01 00:00:00"));
@@ -85,8 +91,12 @@ public class OverspeedEventHandlerTest extends BaseTest {
assertEquals(0, deviceState.getOverspeedGeofenceId());
}
- private void testOverspeedWithStatus(boolean notRepeat) throws Exception {
- OverspeedEventHandler overspeedEventHandler = new OverspeedEventHandler(15000, notRepeat, false);
+ private void testOverspeedWithStatus(boolean notRepeat) {
+ Config config = new Config();
+ config.setString(Keys.EVENT_OVERSPEED_NOT_REPEAT, String.valueOf(notRepeat));
+ config.setString(Keys.EVENT_OVERSPEED_MINIMAL_DURATION, String.valueOf(15));
+ config.setString(Keys.EVENT_OVERSPEED_PREFER_LOWEST, String.valueOf(false));
+ OverspeedEventHandler overspeedEventHandler = new OverspeedEventHandler(config, null, null);
Position position = new Position();
position.setTime(new Date(System.currentTimeMillis() - 30000));