aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2019-02-23 15:33:33 -0800
committerAnton Tananaev <anton.tananaev@gmail.com>2019-02-23 15:33:33 -0800
commitb7d48127e60bcaa5d01f45d8df5203f28f9a1667 (patch)
treea5c6c85460775db357b39e8ac401db3c8d218dc6
parent563243a8da888244e910a4a7a10fb86ad525fdd4 (diff)
downloadtraccar-server-b7d48127e60bcaa5d01f45d8df5203f28f9a1667.tar.gz
traccar-server-b7d48127e60bcaa5d01f45d8df5203f28f9a1667.tar.bz2
traccar-server-b7d48127e60bcaa5d01f45d8df5203f28f9a1667.zip
Refactor distance handler
-rw-r--r--src/org/traccar/BasePipelineFactory.java9
-rw-r--r--src/org/traccar/MainModule.java7
-rw-r--r--src/org/traccar/config/Keys.java18
-rw-r--r--src/org/traccar/handler/DistanceHandler.java (renamed from src/org/traccar/DistanceHandler.java)28
-rw-r--r--test/org/traccar/handler/DistanceHandlerTest.java (renamed from test/org/traccar/DistanceHandlerTest.java)7
5 files changed, 45 insertions, 24 deletions
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index 7f617c470..d32e1fc6c 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -36,6 +36,7 @@ import org.traccar.events.MotionEventHandler;
import org.traccar.events.OverspeedEventHandler;
import org.traccar.handler.ComputedAttributesHandler;
import org.traccar.handler.CopyAttributesHandler;
+import org.traccar.handler.DistanceHandler;
import org.traccar.handler.FilterHandler;
import org.traccar.handler.NetworkMessageHandler;
import org.traccar.handler.OpenChannelHandler;
@@ -50,7 +51,6 @@ public abstract class BasePipelineFactory extends ChannelInitializer<Channel> {
private final TrackerServer server;
private int timeout;
- private DistanceHandler distanceHandler;
private EngineHoursHandler engineHoursHandler;
private RemoteAddressHandler remoteAddressHandler;
private MotionHandler motionHandler;
@@ -78,11 +78,6 @@ public abstract class BasePipelineFactory extends ChannelInitializer<Channel> {
timeout = Context.getConfig().getInteger(Keys.SERVER_TIMEOUT);
}
- distanceHandler = new DistanceHandler(
- Context.getConfig().getBoolean("coordinates.filter"),
- Context.getConfig().getInteger("coordinates.minError"),
- Context.getConfig().getInteger("coordinates.maxError"));
-
if (Context.getConfig().getBoolean("handler.remoteAddress.enable")) {
remoteAddressHandler = new RemoteAddressHandler();
}
@@ -182,7 +177,7 @@ public abstract class BasePipelineFactory extends ChannelInitializer<Channel> {
pipeline,
geolocationHandler,
hemisphereHandler,
- distanceHandler,
+ Main.getInjector().getInstance(DistanceHandler.class),
remoteAddressHandler);
addDynamicHandlers(pipeline);
diff --git a/src/org/traccar/MainModule.java b/src/org/traccar/MainModule.java
index 30cf25d3d..9b16185df 100644
--- a/src/org/traccar/MainModule.java
+++ b/src/org/traccar/MainModule.java
@@ -22,6 +22,7 @@ import com.google.inject.Singleton;
import org.traccar.config.Config;
import org.traccar.config.Keys;
import org.traccar.database.IdentityManager;
+import org.traccar.handler.DistanceHandler;
import org.traccar.handler.FilterHandler;
import javax.ws.rs.client.Client;
@@ -50,6 +51,12 @@ public class MainModule extends AbstractModule {
@Singleton
@Provides
+ public static DistanceHandler provideDistanceHandler(Config config, IdentityManager identityManager) {
+ return new DistanceHandler(config, identityManager);
+ }
+
+ @Singleton
+ @Provides
public static FilterHandler provideFilterHandler(Config config) {
if (config.getBoolean(Keys.FILTER_ENABLE)) {
return new FilterHandler(config);
diff --git a/src/org/traccar/config/Keys.java b/src/org/traccar/config/Keys.java
index aea8e1ebe..6d4653a94 100644
--- a/src/org/traccar/config/Keys.java
+++ b/src/org/traccar/config/Keys.java
@@ -126,6 +126,24 @@ public final class Keys {
Boolean.class,
"Enable attributes skipping. Attribute skipping can be enabled in the config or device attributes");
+ public static final ConfigKey COORDINATES_FILTER = new ConfigKey(
+ "coordinates.filter",
+ Boolean.class,
+ "Replaces coordinates with last known if change is less than a 'coordinates.error' meters. Helps to avoid "
+ + "coordinates jumps during parking period.");
+
+ public static final ConfigKey COORDINATES_MIN_ERROR = new ConfigKey(
+ "coordinates.minError",
+ Integer.class,
+ "Distance in meters. Distances below this value gets handled like explained in 'coordinates.filter'.");
+
+ public static final ConfigKey COORDINATES_MAX_ERROR = new ConfigKey(
+ "filter.maxError",
+ Integer.class,
+ "Distance in meters. Distances above this value gets handled like explained in 'coordinates.filter', but "
+ + "only if Position is also marked as 'invalid'.");
+
+
private Keys() {
}
diff --git a/src/org/traccar/DistanceHandler.java b/src/org/traccar/handler/DistanceHandler.java
index 657f74edf..a336a884e 100644
--- a/src/org/traccar/DistanceHandler.java
+++ b/src/org/traccar/handler/DistanceHandler.java
@@ -1,6 +1,6 @@
/*
* Copyright 2015 Amila Silva
- * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2019 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,9 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.traccar;
+package org.traccar.handler;
import io.netty.channel.ChannelHandler;
+import org.traccar.BaseDataHandler;
+import org.traccar.config.Config;
+import org.traccar.config.Keys;
+import org.traccar.database.IdentityManager;
import org.traccar.helper.DistanceCalculator;
import org.traccar.model.Position;
@@ -26,21 +30,17 @@ import java.math.RoundingMode;
@ChannelHandler.Sharable
public class DistanceHandler extends BaseDataHandler {
+ private final IdentityManager identityManager;
+
private final boolean filter;
private final int coordinatesMinError;
private final int coordinatesMaxError;
- public DistanceHandler(boolean filter, int coordinatesMinError, int coordinatesMaxError) {
- this.filter = filter;
- this.coordinatesMinError = coordinatesMinError;
- this.coordinatesMaxError = coordinatesMaxError;
- }
-
- private Position getLastPosition(long deviceId) {
- if (Context.getIdentityManager() != null) {
- return Context.getIdentityManager().getLastPosition(deviceId);
- }
- return null;
+ public DistanceHandler(Config config, IdentityManager identityManager) {
+ this.identityManager = identityManager;
+ this.filter = config.getBoolean(Keys.COORDINATES_FILTER);
+ this.coordinatesMinError = config.getInteger(Keys.COORDINATES_MIN_ERROR);
+ this.coordinatesMaxError = config.getInteger(Keys.COORDINATES_MAX_ERROR);
}
@Override
@@ -52,7 +52,7 @@ public class DistanceHandler extends BaseDataHandler {
}
double totalDistance = 0.0;
- Position last = getLastPosition(position.getDeviceId());
+ Position last = identityManager != null ? identityManager.getLastPosition(position.getDeviceId()) : null;
if (last != null) {
totalDistance = last.getDouble(Position.KEY_TOTAL_DISTANCE);
if (!position.getAttributes().containsKey(Position.KEY_DISTANCE)) {
diff --git a/test/org/traccar/DistanceHandlerTest.java b/test/org/traccar/handler/DistanceHandlerTest.java
index c97135074..f7c6e42cd 100644
--- a/test/org/traccar/DistanceHandlerTest.java
+++ b/test/org/traccar/handler/DistanceHandlerTest.java
@@ -1,6 +1,7 @@
-package org.traccar;
+package org.traccar.handler;
import org.junit.Test;
+import org.traccar.config.Config;
import org.traccar.model.Position;
import static org.junit.Assert.assertEquals;
@@ -8,9 +9,9 @@ import static org.junit.Assert.assertEquals;
public class DistanceHandlerTest {
@Test
- public void testCalculateDistance() throws Exception {
+ public void testCalculateDistance() {
- DistanceHandler distanceHandler = new DistanceHandler(false, 0, 0);
+ DistanceHandler distanceHandler = new DistanceHandler(new Config(), null);
Position position = distanceHandler.handlePosition(new Position());