From 86d96506f51fc4c49af0487e00ecd2d5ee02218c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 26 Jun 2015 19:42:32 +1200 Subject: Implement session updates --- src/org/traccar/database/DataManager.java | 4 ++++ src/org/traccar/http/AsyncServlet.java | 29 +++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java index e2478ecd6..92f19b903 100644 --- a/src/org/traccar/database/DataManager.java +++ b/src/org/traccar/database/DataManager.java @@ -35,6 +35,7 @@ import javax.sql.DataSource; import org.traccar.Context; import org.traccar.helper.DriverDelegate; import org.traccar.helper.Log; +import org.traccar.http.AsyncServlet; import org.traccar.http.JsonConverter; import org.traccar.model.Device; import org.traccar.model.Permission; @@ -283,6 +284,8 @@ public class DataManager { QueryBuilder.create(dataSource, getQuery("database.deleteDevice")) .setObject(device) .executeUpdate(); + Context.getPermissionsManager().refresh(); + AsyncServlet.sessionRefreshDevice(device.getId()); } public void linkDevice(long userId, long deviceId) throws SQLException { @@ -291,6 +294,7 @@ public class DataManager { .setLong("deviceId", deviceId) .executeUpdate(); Context.getPermissionsManager().refresh(); + AsyncServlet.sessionRefreshUser(userId); } public Collection getPositions(long userId, long deviceId, Date from, Date to) throws SQLException { diff --git a/src/org/traccar/http/AsyncServlet.java b/src/org/traccar/http/AsyncServlet.java index 5481f4ba3..99929731f 100644 --- a/src/org/traccar/http/AsyncServlet.java +++ b/src/org/traccar/http/AsyncServlet.java @@ -18,7 +18,11 @@ package org.traccar.http; import java.io.IOException; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.TimeUnit; import javax.json.Json; import javax.json.JsonObjectBuilder; @@ -51,11 +55,11 @@ public class AsyncServlet extends HttpServlet { private static final boolean DEBUG_ASYNC = false; private static final long SESSION_TIMEOUT = 30; - private static final long REQUEST_TIMEOUT = 10; + private static final long REQUEST_TIMEOUT = 20; private boolean destroyed; private final long userId; - private final Collection devices; + private final Set devices = new HashSet(); private Timeout sessionTimeout; private Timeout requestTimeout; private final Map positions = new HashMap(); @@ -70,7 +74,7 @@ public class AsyncServlet extends HttpServlet { public AsyncSession(long userId, Collection devices) { logEvent("create userId: " + userId + " devices: " + devices.size()); this.userId = userId; - this.devices = devices; + this.devices.addAll(devices); Collection initialPositions = Context.getDataCache().getInitialState(devices); for (Position position : initialPositions) { @@ -80,6 +84,10 @@ public class AsyncServlet extends HttpServlet { Context.getDataCache().addListener(devices, dataListener); } + public boolean hasDevice(long deviceId) { + return devices.contains(deviceId); + } + private final DataCache.DataCacheListener dataListener = new DataCache.DataCacheListener() { @Override public void onUpdate(Position position) { @@ -171,7 +179,20 @@ public class AsyncServlet extends HttpServlet { } - private final Map asyncSessions = new HashMap(); + private static final Map asyncSessions = new HashMap(); + + public static void sessionRefreshUser(long userId) { + asyncSessions.remove(userId); + } + + public static void sessionRefreshDevice(long deviceId) { + Iterator> iterator = asyncSessions.entrySet().iterator(); + while (iterator.hasNext()) { + if (iterator.next().getValue().hasDevice(deviceId)) { + iterator.remove(); + } + } + } private void async(final AsyncContext context) { -- cgit v1.2.3