diff options
author | Simon Rettberg | 2014-03-28 17:51:24 +0100 |
---|---|---|
committer | Simon Rettberg | 2014-03-28 17:51:24 +0100 |
commit | fbbfee0a32ce83f5bfe36d78eddafed7226a041c (patch) | |
tree | f3d44e8b9e2bca678165cb3dd97ec1aa1380f244 /src/main/java/org/openslx/imagemaster/session/SessionManager.java | |
download | masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.gz masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.xz masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.zip |
Initial Commit
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/session/SessionManager.java')
-rw-r--r-- | src/main/java/org/openslx/imagemaster/session/SessionManager.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/session/SessionManager.java b/src/main/java/org/openslx/imagemaster/session/SessionManager.java new file mode 100644 index 0000000..cc68d0b --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/session/SessionManager.java @@ -0,0 +1,73 @@ +package org.openslx.imagemaster.session; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.log4j.Logger; +import org.openslx.imagemaster.thrift.iface.SessionData; +import org.openslx.imagemaster.util.Hash; + +/** + * Class for managing active user sessions. This class and all its function are + * (supposed to be) thread-safe. + */ +public class SessionManager +{ + private static Logger log = Logger.getLogger( SessionManager.class ); + + // Map of currently known sessions + private static final Map<String, Session> sessions = new LinkedHashMap<>(); + private static final Thread gcThread; + + public static SessionData addSession( Session session ) + { + final String authToken = Hash.md5( UUID.randomUUID().toString() ); + final String sessionId = Hash.sha256( UUID.randomUUID().toString() ); + + synchronized ( sessions ) { + sessions.put( authToken, session ); + } + return new SessionData( sessionId, authToken, session.getSatelliteAddress() ); + } + + public static Session getSession( String token ) + { + final Session session; + synchronized ( sessions ) { + session = sessions.get( token ); + } + if ( session == null || session.timedOut() ) { + return null; + } + return session; + } + + static { + gcThread = new Thread( new Runnable() { + @Override + public void run() + { + for ( ;; ) { + try { + Thread.sleep( 1800L * 1000L ); + } catch ( InterruptedException e ) { + } + synchronized ( sessions ) { + Iterator<Session> it = sessions.values().iterator(); + while ( it.hasNext() ) { + final Session s = it.next(); + if ( s.timedOut() ) { + log.debug( "Removing old session of " + s.getUserId() ); + it.remove(); + } + } + } + } + } + } ); + gcThread.start(); + } + +} |