diff options
author | Simon Rettberg | 2015-06-02 19:53:31 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-06-02 19:53:31 +0200 |
commit | 1bc83891c68ee269727e81a13cc70da698bcc7a7 (patch) | |
tree | b052a72ad7d65864068752f71c5ed2b49a171276 /dozentenmodulserver/src/main/java/server/SessionManager.java | |
parent | [server] Started work on the internal file server (diff) | |
download | tutor-module-1bc83891c68ee269727e81a13cc70da698bcc7a7.tar.gz tutor-module-1bc83891c68ee269727e81a13cc70da698bcc7a7.tar.xz tutor-module-1bc83891c68ee269727e81a13cc70da698bcc7a7.zip |
[server] Compiling again, still lots of stubs
Diffstat (limited to 'dozentenmodulserver/src/main/java/server/SessionManager.java')
-rw-r--r-- | dozentenmodulserver/src/main/java/server/SessionManager.java | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/dozentenmodulserver/src/main/java/server/SessionManager.java b/dozentenmodulserver/src/main/java/server/SessionManager.java new file mode 100644 index 00000000..75336de0 --- /dev/null +++ b/dozentenmodulserver/src/main/java/server/SessionManager.java @@ -0,0 +1,84 @@ +package server; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.openslx.imagemaster.thrift.iface.UserInfo; +import org.openslx.thrifthelper.ThriftManager; + +/** + * Manages user sessions. Mainly used to map tokens to users. + * + */ +public class SessionManager { + + private static final Logger LOGGER = Logger.getLogger(SessionManager.class); + + private static class Entry { + private static final long SESSION_TIMEOUT = TimeUnit.DAYS.toMillis(1); + private final UserInfo user; + private long validUntil; + + private Entry(UserInfo user) { + this.user = user; + this.validUntil = System.currentTimeMillis() + SESSION_TIMEOUT; + } + + public void touch(long now) { + this.validUntil = now + SESSION_TIMEOUT; + } + } + + // saves the current tokens and the mapped userdata, returning from the server + private static Map<String, Entry> tokenManager = new ConcurrentHashMap<>(); + + /** + * Get the user corresponding to the given token. Returns null if the token + * is not known, or the session already timed out. + * + * @param token + * user's token + * @return UserInfo for the matching user + */ + public static UserInfo get(String token) { + Entry e = tokenManager.get(token); + if (e != null) { + // User session already cached + final long now = System.currentTimeMillis(); + if (e.validUntil < now) { + tokenManager.remove(token); + return getRemote(token); + } + e.touch(now); + return e.user; + } + return getRemote(token); + } + + /** + * Remove session matching the given token + * + * @param token + */ + public static void remove(String token) { + tokenManager.remove(token); + } + + private static UserInfo getRemote(String token) { + UserInfo ui = null; + try { + ui = ThriftManager.getMasterClient().getUserFromToken(token); + } catch (Exception e) { + LOGGER.warn("Could not reach master server to query for user token of a client!", e); + } + if (ui == null) + return null; + tokenManager.put(token, new Entry(ui)); + return ui; + } + + // TODO: Clean map of old entries periodically + +} |