aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2015-11-18 15:32:05 +1300
committerAnton Tananaev <anton.tananaev@gmail.com>2015-11-18 15:32:05 +1300
commit3990d779545c7dba72324182058ae20730311f97 (patch)
tree3b010a0ce2f2dab29503686c5cc82c6e89e01dde
parent6ec22b7a68b5334e215662e4cb83a20f9a1cad18 (diff)
downloadtraccar-server-3990d779545c7dba72324182058ae20730311f97.tar.gz
traccar-server-3990d779545c7dba72324182058ae20730311f97.tar.bz2
traccar-server-3990d779545c7dba72324182058ae20730311f97.zip
Implement location provider channel handler
-rw-r--r--debug.xml3
-rw-r--r--src/org/traccar/BasePipelineFactory.java9
-rw-r--r--src/org/traccar/Context.java13
-rw-r--r--src/org/traccar/LocationProviderHandler.java68
4 files changed, 93 insertions, 0 deletions
diff --git a/debug.xml b/debug.xml
index b09a73d0a..2e6e4e12a 100644
--- a/debug.xml
+++ b/debug.xml
@@ -18,6 +18,9 @@
<entry key='geocoder.type'>nominatim</entry>
<entry key='geocoder.url'>http://nominatim.openstreetmap.org/reverse</entry>
+ <entry key='location.enable'>false</entry>
+ <entry key='location.key'>fake</entry>
+
<entry key='distance.enable'>true</entry>
<!--<entry key='filter.enable'>true</entry>
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index 6b877883d..4244da8c9 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -31,6 +31,7 @@ import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.handler.logging.LoggingHandler;
import org.jboss.netty.handler.timeout.IdleStateHandler;
import org.traccar.helper.Log;
+import org.traccar.location.LocationProvider;
public abstract class BasePipelineFactory implements ChannelPipelineFactory {
@@ -40,6 +41,7 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
private FilterHandler filterHandler;
private DistanceHandler distanceHandler;
private ReverseGeocoderHandler reverseGeocoderHandler;
+ private LocationProviderHandler locationProviderHandler;
private static final class OpenChannelHandler extends SimpleChannelHandler {
@@ -103,6 +105,10 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
Context.getReverseGeocoder(), Context.getConfig().getBoolean("geocode.processInvalidPositions"));
}
+ if (Context.getLocationProvider() != null) {
+ locationProviderHandler = new LocationProviderHandler(Context.getLocationProvider());
+ }
+
if (Context.getConfig().getBoolean("distance.enable")) {
distanceHandler = new DistanceHandler();
}
@@ -132,6 +138,9 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
if (reverseGeocoderHandler != null) {
pipeline.addLast("geocoder", reverseGeocoderHandler);
}
+ if (locationProviderHandler != null) {
+ pipeline.addLast("location", locationProviderHandler);
+ }
pipeline.addLast("remoteAddress", new RemoteAddressHandler());
addDynamicHandlers(pipeline);
diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java
index 113ed02ec..aff72cd01 100644
--- a/src/org/traccar/Context.java
+++ b/src/org/traccar/Context.java
@@ -29,6 +29,8 @@ import org.traccar.geocode.NominatimReverseGeocoder;
import org.traccar.geocode.OpenCageReverseGeocoder;
import org.traccar.geocode.ReverseGeocoder;
import org.traccar.helper.Log;
+import org.traccar.location.LocationProvider;
+import org.traccar.location.OpenCellIdLocationProvider;
import org.traccar.web.WebServer;
public final class Context {
@@ -78,6 +80,12 @@ public final class Context {
return reverseGeocoder;
}
+ private static LocationProvider locationProvider;
+
+ public static LocationProvider getLocationProvider() {
+ return locationProvider;
+ }
+
private static WebServer webServer;
public static WebServer getWebServer() {
@@ -144,6 +152,11 @@ public final class Context {
}
}
+ if (config.getBoolean("location.enable")) {
+ String key = config.getString("location.key");
+ locationProvider = new OpenCellIdLocationProvider(key);
+ }
+
if (config.getBoolean("web.enable")) {
if (config.getString("web.type", "new").equals("new")
|| config.getString("web.type", "new").equals("api")) {
diff --git a/src/org/traccar/LocationProviderHandler.java b/src/org/traccar/LocationProviderHandler.java
new file mode 100644
index 000000000..024d9fb95
--- /dev/null
+++ b/src/org/traccar/LocationProviderHandler.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.traccar;
+
+import org.jboss.netty.channel.ChannelEvent;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.Channels;
+import org.jboss.netty.channel.MessageEvent;
+import org.traccar.location.LocationProvider;
+import org.traccar.model.Position;
+
+public class LocationProviderHandler implements ChannelUpstreamHandler {
+
+ private final LocationProvider locationProvider;
+
+ public LocationProviderHandler(LocationProvider locationProvider) {
+ this.locationProvider = locationProvider;
+ }
+
+ @Override
+ public void handleUpstream(final ChannelHandlerContext ctx, ChannelEvent evt) throws Exception {
+ if (!(evt instanceof MessageEvent)) {
+ ctx.sendUpstream(evt);
+ return;
+ }
+
+ final MessageEvent e = (MessageEvent) evt;
+ Object message = e.getMessage();
+ if (message instanceof Position) {
+ final Position position = (Position) message;
+ if (locationProvider != null && position.getOutdated()) {
+ locationProvider.getLocation(position.getAttributes(), new LocationProvider.LocationProviderCallback() {
+ @Override
+ public void onSuccess(double latitude, double longitude) {
+ position.setFixTime(position.getDeviceTime());
+ position.setLatitude(latitude);
+ position.setLongitude(longitude);
+ Channels.fireMessageReceived(ctx, position, e.getRemoteAddress());
+ }
+
+ @Override
+ public void onFailure() {
+ Channels.fireMessageReceived(ctx, position, e.getRemoteAddress());
+ }
+ });
+ } else {
+ Channels.fireMessageReceived(ctx, position, e.getRemoteAddress());
+ }
+ } else {
+ Channels.fireMessageReceived(ctx, message, e.getRemoteAddress());
+ }
+ }
+
+}