diff options
author | Abyss777 <abyss@fox5.ru> | 2016-07-13 17:37:31 +0500 |
---|---|---|
committer | Abyss777 <abyss@fox5.ru> | 2016-07-13 17:37:31 +0500 |
commit | 51f22a533b0e511bd97da6d46a676ac15a47884d (patch) | |
tree | 2034612c196bc741594a4585fc58785cee87826a | |
parent | 5f5c61f17fdf8ecd3e70112b32aaf4a8d04f2335 (diff) | |
download | trackermap-server-51f22a533b0e511bd97da6d46a676ac15a47884d.tar.gz trackermap-server-51f22a533b0e511bd97da6d46a676ac15a47884d.tar.bz2 trackermap-server-51f22a533b0e511bd97da6d46a676ac15a47884d.zip |
Added possibility to forward all events via POST request.
-rw-r--r-- | debug.xml | 6 | ||||
-rw-r--r-- | src/org/traccar/database/NotificationManager.java | 7 | ||||
-rw-r--r-- | src/org/traccar/notification/NotificationForward.java | 71 |
3 files changed, 84 insertions, 0 deletions
@@ -48,6 +48,12 @@ <entry key='event.motionHandler'>true</entry> <entry key='event.geofenceHandler'>true</entry> + <!--<entry key='event.forward.enable'>true</entry> + <entry key='event.forward.url'>http://localhost/</entry> + <entry key='event.forward.header'> + Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l + </entry>--> + <!--<entry key='mail.smtp.host'>smtp.example.com</entry> for STARTTLS <entry key='mail.smtp.port'>587</entry> diff --git a/src/org/traccar/database/NotificationManager.java b/src/org/traccar/database/NotificationManager.java index e618d7ed3..90edce43e 100644 --- a/src/org/traccar/database/NotificationManager.java +++ b/src/org/traccar/database/NotificationManager.java @@ -31,6 +31,7 @@ import org.traccar.helper.Log; import org.traccar.model.Event; import org.traccar.model.Notification; import org.traccar.model.Position; +import org.traccar.notification.NotificationForward; import org.traccar.notification.NotificationMail; public class NotificationManager { @@ -41,8 +42,11 @@ public class NotificationManager { private final ReadWriteLock notificationsLock = new ReentrantReadWriteLock(); + private final boolean forward; + public NotificationManager(DataManager dataManager) { this.dataManager = dataManager; + forward = Context.getConfig().getBoolean("event.forward.enable"); refresh(); } @@ -68,6 +72,9 @@ public class NotificationManager { } } } + if (forward) { + NotificationForward.forwardEvent(event, position); + } } public void updateEvents(Collection<Event> events, Position position) { diff --git a/src/org/traccar/notification/NotificationForward.java b/src/org/traccar/notification/NotificationForward.java new file mode 100644 index 000000000..32f8a1ffc --- /dev/null +++ b/src/org/traccar/notification/NotificationForward.java @@ -0,0 +1,71 @@ +package org.traccar.notification; + +import java.nio.charset.StandardCharsets; + +import javax.json.Json; +import javax.json.JsonObjectBuilder; + +import org.traccar.Context; +import org.traccar.model.Device; +import org.traccar.model.Event; +import org.traccar.model.Geofence; +import org.traccar.model.Position; +import org.traccar.web.JsonConverter; + +import com.ning.http.client.AsyncHttpClient.BoundRequestBuilder; + +public final class NotificationForward { + + private NotificationForward() { + } + + private static final String USER_AGENT = "Traccar Server"; + + private static final String KEY_POSITION = "position"; + private static final String KEY_EVENT = "event"; + private static final String KEY_GEOFENCE = "geofence"; + private static final String KEY_DEVICE = "device"; + + public static void forwardEvent(Event event, Position position) { + String url = Context.getConfig().getString("event.forward.url", "http://localhost/"); + String header = Context.getConfig().getString("event.forward.header", ""); + + BoundRequestBuilder requestBuilder = Context.getAsyncHttpClient().preparePost(url); + + requestBuilder.addHeader("Content-Type", "application/json; charset=utf-8"); + requestBuilder.addHeader("User-Agent", USER_AGENT); + if (!header.equals("")) { + String[] headerLines = header.split("\\r?\\n"); + for (String headerLine: headerLines) { + String[] splitedLine = headerLine.split(":", 2); + if (splitedLine.length == 2) { + requestBuilder.addHeader(splitedLine[0].trim(), splitedLine[1].trim()); + } + } + } + + requestBuilder.setBody(preparePayload(event, position)); + requestBuilder.execute(); + } + + private static byte[] preparePayload(Event event, Position position) { + JsonObjectBuilder json = Json.createObjectBuilder(); + json.add(KEY_EVENT, JsonConverter.objectToJson(event)); + if (position != null) { + json.add(KEY_POSITION, JsonConverter.objectToJson(position)); + } + if (event.getDeviceId() != 0) { + Device device = Context.getIdentityManager().getDeviceById(event.getDeviceId()); + if (device != null) { + json.add(KEY_DEVICE, JsonConverter.objectToJson(device)); + } + } + if (event.getGeofenceId() != 0) { + Geofence geofence = Context.getGeofenceManager().getGeofence(event.getGeofenceId()); + if (geofence != null) { + json.add(KEY_GEOFENCE, JsonConverter.objectToJson(geofence)); + } + } + return json.build().toString().getBytes(StandardCharsets.UTF_8); + } +} |